時間と日付を変換して、ログのクエリと分析の効率を向上させることができます。 このトピックでは、関数を使用してdatetimeを変換およびオフセットする方法について説明します。
用語
ドメイン固有言語 (DSL) は、datetime文字列、datetimeオブジェクト、およびUNIX timestampの3つのデータ型をサポートしています。
Datetime文字列
日時文字列を使用して、日時データを読み取り可能な文字列に変換します。 Datetime文字列は、DSL構文では2つのタイプに分けられます。
タイムゾーンを持つ日付文字列 (
2019-06-02 18:41:26 + 08:00
など) 。タイムゾーンのない日付文字列 (
2019-06-02 10:41:26
など) 。
タイムゾーンを含むdatetime文字列では、タイムゾーンを示すために日時に時差が追加されます。 例:
2019-06-02 18:41:26 + 08:00
は、datetime2019-06-02 18:41:26
がUTC + 8
タイムゾーンにあることを示します。2019-06-02 18:41:26-07:00
は、datetime2019-06-02 18:41:26
がUTC-7
タイムゾーンにあることを示します。
Datetime object
Datetimeオブジェクトは、データと時刻を示すためにインスタンス化されます。 Datetimeオブジェクトは、時刻と日付のデータを読み取り可能な文字列に変換するために使用されます。
UNIXタイムスタンプ
UNIXタイムスタンプは、1970年1月1日木曜日00:00:00から経過した秒数を示します。 UNIXタイムスタンプは、次のシナリオで使用できます。
システム時間を表示します。
イベントログでは、メタデータフィールド
__time__
はログが生成された時刻を示し、フィールド__receive_time__
はLog Serviceがログを受信した時刻を示します。 これらのフィールドの値は、UNIXタイムスタンプを使用してシステム時刻を示します。__source__: 192.0.2.1 __tag__:__receive_time__: 1562741899 __topic__: __time__: 1562731122
時間関連の計算を実行します。
UNIXタイムスタンプは、1970年1月1日木曜日00:00:00から経過した秒数を示します。 UNIXタイムスタンプを使用して、複数のシナリオで時間関連の計算を実行できます。 設定例:
未加工のログエントリ
time1: 1562741899 time2: 1562731122
DSL オーケストレーション
e_set("time_diff", op_sub(v("time1"), v("time2")))
結果
time1: 1562741899 time2: 1562731122 time_diff: 10777
関数を使用してデータ型を変換する
次の図は、関数を使用して、datetime文字列、datetimeオブジェクト、およびUNIX timestampの3つのデータ型を変換する方法を示しています。 次の表に、変換シナリオと変換関数を示します。
変換シナリオ | 変換関数 | |
datetimeオブジェクトとUNIXタイムスタンプ間の変換を実行します。 | datetime オブジェクトから UNIX timestamp への変換 |
|
UNIX timestamp から datetime オブジェクトへの変換 |
| |
datetimeオブジェクトとdatetime文字列の変換を実行します。 | datetime オブジェクトから datetime 文字列への変換 |
|
datetime 文字列から datetime オブジェクトへの変換 |
| |
datetime文字列とUNIX timestampの間の変換を実行します。 | datetime 文字列から UNIX timestamp への変換 |
|
UNIX timestamp から datetime 文字列への変換 |
|
上記の表では、3つの変換シナリオと6つの変換関数について説明します。 これらの変換関数は、次の2つのタイプに分けられます。
自動変換関数
dt_parse
などの自動変換関数は、UNIXタイムスタンプ、datetimeオブジェクト、datetime文字列などのさまざまなデータ型を自動的に変換します。専用関数
自動変換関数は、一部のシナリオで要件を満たすことができません。 たとえば、
dt_parse
などの自動変換関数は、一部のカスタム形式の日付型を解析できません。 この場合、dt_strptime
関数を使用する必要があります。
datetimeオブジェクトとUNIXタイムスタンプ間の変換を実行する
変換関数
dt_parsetimestamp
: 推奨されます。 この自動変換関数は、datetimeオブジェクトまたはdatetime文字列をUNIXタイムスタンプに変換します。e_set
: この関数でtzパラメーターを設定すると、datetimeオブジェクトにタイムゾーンを追加できます。 tzパラメーターを設定して、ソースタイムゾーンをターゲットタイムゾーンに変換することもできます。
UNIXタイムスタンプをタイムゾーンを持つdatetime文字列に変換します。
未加工のログエントリ
time: 1562741899
DSL オーケストレーション
e_set("new_time", dt_parse(v("time"), tz="Asia/Shanghai"))
結果
time: 1562741899 new_time: 2019-07-10 06:58:19+08:00
Perform datetime間変換文字列とUNIXタイムスタンプ
変換関数
dt_str
: UNIX timestamp、datetimeオブジェクト、またはdatetime文字列を、指定した形式のdatetime文字列に変換します。dt_strftimestamp
: 変換UNIXタイムスタンプにdatetime string.dt_parsetimestamp
: datetime文字列またはdatetimeオブジェクトをUNIX timestampに変換します。
シナリオ1: タイムゾーンのないdatetime文字列をUNIX timestampに変換します。
For例変換するために、
2019-06-02 18:41:26
UNIXにタイムスタンプ、指定する必要時間ゾーンをdatetime string. The変換UNIXタイムスタンプ変化時間ゾーン。未加工のログエントリ
time: 2019-06-02 18:41:26
DSL オーケストレーション
e_set("Shanghai_timestamp", dt_parsetimestamp(v("time"), tz="Asia/Shanghai")) e_set("Los_Angeles_timestamp", dt_parsetimestamp(v("time"), tz="America/Los_Angeles")) e_set("UTC_timestamp", dt_parsetimestamp(v("time")))
結果
Shanghai_timestamp: 1559472086 Los_Angeles_timestamp: 1559526086 UTC_timestamp: 1559500886
説明tz="Asia/Shanghai"
は、time
フィールドに示されている時刻が上海のタイムゾーンであることを示しています。タイムゾーンを指定しない場合、UTC + 0のタイムゾーンがデフォルトのタイムゾーンとして使用されます。
tz=time zone string
パラメーターの値の詳細については、「Time zones」をご参照ください。
シナリオ2: タイムゾーンを含むdatetime文字列をUNIX timestampに変換します。
datetime文字列にタイムゾーンが含まれている場合、
2019-06-02 18:41:26 + 08:00
など、タイムゾーンパラメーターを指定する必要はありません。未加工のログエントリ
China_time : 2019-06-02 18:41:26+08:00 America_time: 2019-06-02 3:41:26-07:00 UTC_time : 2019-06-02 10:41:26+00:00
DSL オーケストレーション
e_set("timestamp1", dt_parsetimestamp(v("China_time"))) e_set("timestamp2", dt_parsetimestamp(v("America_time"))) e_set("timestamp3", dt_parsetimestamp(v("UTC_time")))
結果
America_time:2019-06-02 3:41:26-07:00 China_time:2019-06-02 18:41:26+08:00 UTC_time:2019-06-02 10:41:26+00:00 timestamp1: 1559472086 timestamp2: 1559472086 timestamp3: 1559472086
Scenario 3: Convertカスタムdatetimeなし時間ゾーンにUNIXタイムスタンプ。
未加工のログエントリ
time1: 2019-07-10 06:58:19 time2: 2019/07/10 06-58-19
DSL オーケストレーション
e_set("time3", dt_parsetimestamp(v("time1"))) e_set("time4", dt_parsetimestamp(dt_strptime(v("time2"), "%Y/%m/%d %H-%M-%S")))
結果
time1: 2019-07-10 06:58:19 time2: 2019/07/10 06-58-19 time3: 1562741899 time4: 1562741899
datetimeオブジェクトとdatetime文字列の変換を実行します。
変換関数
dt_parse
: datetime文字列またはUNIX timestampをdatetimeオブジェクトに変換します。dt_astimezone
: タイムゾーンを含むdatetimeオブジェクトを返します。
シナリオ1: タイムゾーンのないdatetime文字列を、指定したタイムゾーンのdatetimeオブジェクトに変換します。
たとえば、
2019-06-02 18:41:26
の日時文字列をUNIX timestampに変換してから、UNIX timestampを別のタイムゾーンの日時文字列に変換できます。 次の例は、ロサンゼルスのタイムゾーンのdatetimeを上海のタイムゾーンのdatetimeに変換する方法を示しています。未加工のログエントリ
# Assume that the datetime in the time field is the time zone of Los Angeles. time : 2019-06-04 2:41:26
DSL オーケストレーション
e_set("timestamp", dt_parsetimestamp(v("time"), tz="America/Los_Angeles")) e_set("Shanghai_time", dt_parse(v("timestamp"), tz="Asia/Shanghai"))
結果
Shanghai_time : 2019-06-04 17:41:26+08:00 time : 2019-06-04 2:41:26 timestamp:1559641286
シナリオ2: タイムゾーンのないdatetime文字列を、タイムゾーンのあるdatetimeオブジェクトに変換します。
未加工のログエントリ
time : 2019-07-10 06:58:19
DSL オーケストレーション
e_set("new_time", dt_parse(v("time"), tz="Asia/Shanghai"))
結果
time: 2019-07-10 06:58:19 new_time: 2019-07-10 06:58:19+08:00
シナリオ3: タイムゾーンを含むdatetime文字列を、宛先タイムゾーンのdatetimeオブジェクトに変換します。
未加工のログエントリ
time : 2019-06-04 2:41:26+08:00
DSL オーケストレーション
e_set("new_time", dt_astimezone(v("time"), tz="America/Los_Angeles"))
結果
new_time : 2019-06-03 11:41:26-07:00 time : 2019-06-04 2:41:26+08:00
オフセットdatetimes
変換関数
dt_add
関数: 次の構文は、この関数のパラメーターを示しています。dt_add (field name, dt1 = None, dt2 = None, year (s) = None, month (s) = None, day (s) = None, hour (s) = None, minute (s) = None, second (s) = None, microsecond (s) = None, weeks (s) = None, weekday = None)
year (s)
、month (s)
、day (s)
などの (s) で終わるパラメータには、2つのパターンがあります。 例えば、年は年
と年
とすることができ、月は月
と月
とすることができる。 例として年
と年
を取ります。 構文でyear
が使用されている場合、year
の値は生のログエントリのyearの値を置き換えます。 構文でyears
が使用されている場合、生のログエントリのyearの値にyears
の値が追加されます。dt_add
関数を同時に使用する必要があります。 この関数を使用すると、値を追加したり、値を減算したり、datetimeの値を上書きしたりできます。dt_add
関数のweekday
パラメーターは、dt_MO
およびdt_TU
パラメーターとともに使用して、指定された平日をオフセットします。 詳細については、「dt_MO」をご参照ください。
シナリオ1: 日時を年と月でオフセットします。
次の例は、年と月でdatetimeをオフセットする方法を示しています。
未加工のログエントリ
time1 : 2019-06-04 2:41:26
DSLオーケストレーション1
e_set("time2", dt_add(v("time1"), year=2018))
結果1
time1 : 2019-06-04 2:41:26 time2 : 2018-06-04 02:41:26
DSLオーケストレーション2
e_set("time2", dt_add(v("time1"), years=2018))
結果2
time1 : 2019-06-04 2:41:26 time2 : 4037-06-04 02:41:26
シナリオ2: datetimeを週単位でオフセットする
次の例は、datetimeを週単位でオフセットする方法を示しています。
未加工のログエントリ
# June 4, 2019 is a Tuesday. time1 : 2019-06-04 2:41:26
DSL オーケストレーション
# Return the datetime of the next Monday after time1. e_set("nex_Monday", dt_add(v("time1"), weekday=dt_MO(1))) # Return the datetime of the last Tuesday before time1. e_set("previous_Tuesday", dt_add(v("time1"), weekday=dt_TU(op_neg(1)))) # Return the datetime of the second Saturday after time1. e_set("nex_next_Saturday", dt_add(v("time1"), weekday=dt_SA(2))) # Return the datetime of the second to last Sunday before time1. e_set("previous_previous_Sunday", dt_add(v("time1"), weekday=dt_SU(op_neg(2))))
結果
next_Monday : 2019-06-10 02:41:26 next_next_Saturday : 2019-06-15 02:41:26 previous_Tuesday : 2019-06-04 2:41:26 previous_previous_Sunday : 2019-05-26 02:41:26 time1 : 2019-06-04 2:41:26
説明時刻1
が火曜日である場合、最後の火曜日および次の火曜日は、時刻1
の1週間前または後の日である。