JMeter の __timeShift 関数は、任意の基準日時を元に指定した時間分だけ加算/減算し、フォーマットされた日時文字列を返す強力なツールです。特にLoadテストにおける**: テスト日付の動的生成**や、**有効期限付きリクエストの構築**などに広く利用されます。
関数構文
${__timeShift(日時フォーマット, 対象日時, オフセット定数, ロケール, 変数名)}
各引数の意味
| 引数順 | 名称 | 必須? | 説明 |
|---|---|---|---|
| 1番目 | 日時フォーマット | 任意 | 出力形式(SimpleDateFormat準拠)。未指定時はUNIXタイムスタンプ(ミリ秒)で返却。 |
| 2番目 | 対象日時 | 任意 | 基準となる日時。未指定時はテスト実行時の時刻が使われます。 |
| 3番目 | オフセット定数 | 任意 | ISO 8601 形式の期間(Period)で表す加減算値。省略時は変更なし。 |
| 4番目 | ロケール | 任意 | 言語環境(例:ja_JP)。月名や曜日の表示に影響します。 |
| 5番目 | 変数名 | 任意 | 結果を保存する変数名。設定時は関数の評価値が空文字となり、代わりに変数に保持されます。 |
Period形式(オフセット定数)の記述ルール
JMeter の時間オフセットはISO 8601standardに準拠しており、以下のような構成になります:
P:Period indicatoralways presentT:Time division indicator(分・秒・ミリ秒が含まれる場合に必須)- 数字+単位(大文字 phải strict)
D:日H:時間M:分(※注意:MはMonthではない)S:秒(小数可)
- 負数表現:先頭に
-を付与(例:-P1D)
代表的な記述例
| 目的 | 記述例 |
|---|---|
| 翌日 | P1D |
| 1週間後 | P7D |
| 3日前 | -P3D |
| 2時間後 | PT2H |
| 45分前 | -PT45M |
| 1日12時間30分後 | P1DT12H30M |
| 750ms後 | PT0.75S |
具体的应用例
実行時刻を「2026-04-01 20:44:24」前提で動作確認:
問い合わせ日時:
${__toString(${__timeShift(yyyy-MM-dd,,P0D,)})}
明日の日付:
${__timeShift(yyyy-MM-dd,,P1D,)}
2週間前:
${__timeShift(yyyy-MM-dd,,P-14D,)}
当日の23:59:59の10分前(スロット終了時刻):
${__timeShift(yyyy-MM-dd HH:mm:ss,,PT-10M,)}
昨日のDATEキー:
${__timeShift(yyyyMMdd,,-P1D,)}
指定日からのカウントダウン(例:2026-12-31まで残り何日か):
${__timeShift(d,2026-12-31,-P,)}
JSR223スクリプト内での活用(Python)
JMeter関数はスクリプト言語内でも参照できます。ただし、直接埋め込むにはエスケープに注意が必要です:
import jarray
from org.apache.jmeter.functions import @Property
# JMeter関数の結果を取得(変数nameは非推奨だが対応可能)
current_plus_five = __jmeter_func__("timeShift", "yyyy-MM-dd HH:mm:ss", "", "PT5H", "", "")
print("5時間後:", current_plus_five)
# 実際のテストでは、スレッドグループ属性や変数と組み合わせるのが安全
base_date = vars["booking_date"]
offset_days = 30
due_date = __jmeter_func__("timeShift", "yyyy-MM-dd", base_date, "P"+str(offset_days)+"D", "", "")
入力時注意事項
Tの挿入位置:PT1H30Mのように、時間以上が含まれる場合は必ずT区切りが必要です。- ケースセンシティブ:単位記号(D/H/M/S)は原則大文字が推奨され、小文字では解析エラーになる可能性があります。
- 乱漏れ防止:
MM(月)/mm(分)など混同しやすいフォーマットはテスト実行環境でpeek確認しましょう。 - タイムゾーン:JMeterはJVM起動時のデフォルトタイムゾーンを使用します。UTC前提のテストでは明示的に
-Duser.timezone=UTC指定してください。
${__toString(${__timeShift(yyyy-MM-dd,,P0D,)})}
⇒ 2026-04-01
${__toString(${__timeShift(yyyy-MM-dd H:mm:ss,,-PT12H,)})}
⇒ 2026-04-01 8:44:24
${__toString(${__timeShift(MMM/dd/yyyy HHmm,2026-01-01 00:00:00,P60D,)})}
⇒ Mar 02/2026 0000