メールの送信日時を抽出してDatetime型として取り扱う方法

コメント

1件のコメント

  • 正式なコメント
    Ichiro Takahashi

    フィックスポイントの高橋です。

    日時を示す文字列を Datetime 型に変換する方法として、まず標準では datetime() 組み込み関数を用いる方法があります。たとえば次のようなジョブフローを作成してみます。

    |str = "Thu, 6 Jun 2024 06:52:16 +0000"|
    |fmt = "%a, %d %b %Y %H:%M:%S %z"|
    [result = datetime(str, fmt)] ->
    print(type(result), ':', result)

    これを実行すると以下のように、Datetime 型に変換できた結果が得られます。

    Datetime : 2024-06-06 15:52:16+09:00

    ここで、datetime() 関数の第二引数でパースするフォーマットを指定しています。

    一方で、メールの Date: ヘッダの形式には利用されているメールソフトなどにより、多少の揺らぎがあると思います。手元でいくつか確認すると末尾に "(UTC)" などのタイムゾーン表記がある場合もあるようです。上記のサンプルですと、そうした表記揺らぎへの対応は弱くなります。

    そこで、別の手法として Python ライブラリを用いた変換方法についてもご紹介しておきます。

    たとえば、以下のようなライブラリオブジェクトを "lib_email" という名前で作成します。

    from email.utils import parsedate_to_datetime

    def parsedate(s):
      return parsedate_to_datetime(s)

    このライブラリを用いるように、今度は以下のようなジョブフローを作成してみます(ライブラリオブジェクトはジョブフローと同じディレクトリにある想定です)。

    |str = "Thu, 6 Jun 2024 06:52:16 +0000 (UTC)"|
    [parsedate = ./lib_email.parsedate] ->
    [result = parsedate(str)] ->
    print(type(result), ':', result)

    同様にこれを実行してみると、タイムゾーン表記があっても(なくても)以下のように Datetime 型に変換できていることがわかります。

    Datetime : 2024-06-06 06:52:16+09:00

    他にも方法はあるかと思いますが、一例として参考になさってみてください。

    コメントアクション パーマリンク

サインインしてコメントを残してください。