すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:datetimeの変換

最終更新日:Aug 28, 2024

時間と日付を変換して、ログのクエリと分析の効率を向上させることができます。 このトピックでは、関数を使用して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は、datetime 2019-06-02 18:41:26UTC + 8タイムゾーンにあることを示します。

    • 2019-06-02 18:41:26-07:00は、datetime 2019-06-02 18:41:26UTC-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 への変換

  • dt_parsetimestamp: datetime変換オブジェクトまたはdatetime文字列にUNIXタイムスタンプ。

  • dt_totimestamp: datetimeオブジェクトをUNIX timestampに変換します。

UNIX timestamp から datetime オブジェクトへの変換

  • dt_parse: UNIX timestampまたはdatetime文字列をdatetimeオブジェクトに変換します。

  • dt_fromtimestamp: UNIXタイムスタンプをdatetimeオブジェクトに変換します。

datetimeオブジェクトとdatetime文字列の変換を実行します。

datetime オブジェクトから datetime 文字列への変換

  • dt_str: datetimeオブジェクト、UNIX timestamp、またはdatetime文字列を、指定した形式のdatetime文字列に変換します。

  • dt_strftime: datetimeオブジェクトをdatetime文字列に変換します。

datetime 文字列から datetime オブジェクトへの変換

  • dt_parse: datetime文字列またはUNIX timestampをdatetimeオブジェクトに変換します。

  • dt_strptime: datetime文字列をdatetimeオブジェクトに変換します。

datetime文字列とUNIX timestampの間の変換を実行します。

datetime 文字列から UNIX timestamp への変換

dt_parsetimestamp: datetime文字列またはdatetimeオブジェクトをUNIX timestampに変換します。

UNIX timestamp から datetime 文字列への変換

  • dt_str: UNIX timestamp、datetimeオブジェクト、またはdatetime文字列を、指定した形式のdatetime文字列に変換します。

  • dt_strftimestamp: 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週間前または後の日である。