83388


# 環境

  * Python3.8

# やりたいこと

datetimeオブジェクトをISO8601形式の文字列にしたいです。具体的には以下の要件を満たしたいです。

  * 末尾が"Z"
  * ミリ秒まで出力

以下のように `strftime` 関数を用いて出力すると、マイクロ秒まで出力されてしまいます。

[code]

    import datetime
    dt=datetime.datetime(2021,1,1,2,3,4,123456, tzinfo=datetime.timezone.utc)
    expected = "2021-01-01T02:03:04.123Z"
    actual = dt.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
    print(actual)
    # '2021-01-01T02:03:04.123456Z'
    
[/code]

# 質問

上記の要件を満たす文字列を生成するには、どのように書くのがシンプルでしょうか？  
以下のように書けば要件は満たせますが、文字列操作の部分が分かりづらいと感じています。

[code]

    tmp = dt.isoformat(timespec="milliseconds")
    print(tmp)
    # 2021-01-01T02:03:04.123+00:00
    actual = tmp[0:23] + "Z"
    print(actual)
    # 2021-01-01T02:03:04.123Z
    
[/code]

便利な方法やライブラリがあれば教えていただきたいです。


CC BY-SA 4.0
2021-11-02T04:38:23.207
83386
2021-11-02T05:54:18.727
19524
question
python
datetimeオブジェクトを、ISO8601形式（末尾"Z"かつミリ秒まで）の文字列に変換したいです。どのように書くのがシンプルでしょうか？


簡単, かもしれない方法

[code]

    print(dt.isoformat(timespec='milliseconds').replace('+00:00', 'Z'))
    
[/code]

少し面倒かもしれない方法

[code]

    from datetime import tzinfo, timedelta, datetime, timezone
    class TZ(tzinfo):
        def utcoffset(self, dt):
            pass
        def dst(self, dt):
            return timedelta(0)
    
    dt = datetime(2021,1,1,2,3,4,123456, tzinfo=TZ())
    
    
    print('{}Z'.format(dt.isoformat(timespec='milliseconds')))
    
[/code]


CC BY-SA 4.0
2021-11-02T05:54:18.727
83388
2021-11-02T05:54:18.727
43025
83386
answer