web-dev-qa-db-ja.com

PythonのISO時間(ISO 8601)

ファイルがあります。 Pythonでは、その作成時間をとり、それを ISO時間(ISO 8601)文字列に変換したいのです。 東部時間帯 (ET)

ファイルのctimeを取得し、それをEastern Time Zoneを示すISO時間文字列に変換するにはどうすればよいですか(必要であれば夏時間を考慮に入れます)。

214
Joseph Turian

ISO 8601にローカル:

import datetime
datetime.datetime.now().isoformat()

ISO 8601へのUTC:

import datetime
datetime.datetime.utcnow().isoformat()

マイクロ秒なしでISO 8601にローカル:

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()

TimeZone情報を含むISO 8601へのUTC(Python 3):

import datetime
datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()

TimeZone情報を含むISO 8601にローカル(Python 3)

import datetime, time

# Calculate the offset taking into account daylight saving time
utc_offset_sec = time.altzone if time.localtime().tm_isdst else time.timezone
utc_offset = datetime.timedelta(seconds=-utc_offset_sec)
datetime.datetime.now().replace(tzinfo=datetime.timezone(offset=utc_offset)).isoformat()

Python 2では、 pytz を見てください。

333
estani

Datetime.isoformatは ドキュメント にあります。それはあなたが望むことをするようです:

datetime.isoformat([sep])

Return a string representing the date and time in ISO 8601 format, YYYY-MM-DDTHH:MM:SS.mmmmmm or, if microsecond is 0, YYYY-MM-DDTHH:MM:SS

If utcoffset() does not return None, a 6-character string is appended, giving the UTC offset in (signed) hours and minutes: YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or, if microsecond is 0 YYYY-MM-DDTHH:MM:SS+HH:MM

The optional argument sep (default 'T') is a one-character separator, placed between the date and time portions of the result. For example,
>>>

>>> from datetime import tzinfo, timedelta, datetime
>>> class TZ(tzinfo):
...     def utcoffset(self, dt): return timedelta(minutes=-399)
...
>>> datetime(2002, 12, 25, tzinfo=TZ()).isoformat(' ')
'2002-12-25 00:00:00-06:39'
48
user2120810

ISO 8601時間表現

国際標準ISO 8601には、日付と時刻の文字列表現が記載されています。このフォーマットの2つの簡単な例は

2010-12-16 17:22:15
20101216T172215

(どちらも2010年12月16日を表します)しかし、フォーマットはまた1秒未満の解決時間と時間帯を指定することを可能にします。このフォーマットはもちろんPython固有のものではありませんが、日付と時刻を移植可能なフォーマットで保存するのに適しています。このフォーマットに関する詳細は Markus Kuhn entry にあります。

時間をファイルに保存するには、この形式の使用をお勧めします。

この表現で現在時刻を取得する1つの方法は、Python標準ライブラリのtimeモジュールからstrftimeを使用することです。

>>> from time import strftime
>>> strftime("%Y-%m-%d %H:%M:%S")
'2010-03-03 21:16:45'

Datetimeクラスのstrptimeコンストラクタを使うことができます。

>>> from datetime import datetime
>>> datetime.strptime("2010-06-04 21:08:12", "%Y-%m-%d %H:%M:%S")
datetime.datetime(2010, 6, 4, 21, 8, 12)

最も堅牢なのはEgenixのmxDateTimeモジュールです。

>>> from mx.DateTime.ISO import ParseDateTimeUTC
>>> from datetime import datetime
>>> x = ParseDateTimeUTC("2010-06-04 21:08:12")
>>> datetime.fromtimestamp(x)
datetime.datetime(2010, 3, 6, 21, 8, 12)

参考文献

46
Voislav Sauca

これが私がXSD日時フォーマットに変換するために使うものです:

from datetime import datetime
datetime.now().replace(microsecond=0).isoformat()
# You get your ISO string

私はXSDの日付時刻フォーマット(xs:dateTime)を探すときにこの質問に出会いました。 isoformatからマイクロ秒を削除する必要がありました。

44
radtek

ISO 8601 time format はタイムゾーン名を保存しません、対応するUTCオフセットだけが保存されます。

Python 3でUTCオフセットを保持しながら、ファイルctimeをISO 8601時間文字列に変換するには、次のようにします。

>>> import os
>>> from datetime import datetime, timezone
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, timezone.utc)
>>> dt.astimezone().isoformat()
'2015-11-27T00:29:06.839600-05:00'

このコードでは、ローカルのタイムゾーンが Eastern Time Zone (ET)であり、システムが特定のPOSIXタイムスタンプ(ts)に対して正しいUTCオフセットを提供していると仮定しています。あなたのシステムまたはタイムゾーンは与えられた日付で同じ規則を持っていました。

ポータブルソリューションが必要な場合 pytzモジュールを使用する アクセスを提供する tzデータベース

>>> import os
>>> from datetime import datetime
>>> import pytz  # pip install pytz
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, pytz.timezone('America/New_York'))
>>> dt.isoformat()
'2015-11-27T00:29:06.839600-05:00'

この場合も結果は同じです。

タイムゾーン名/略称/ゾーンIDが必要な場合は、別に保存してください。

>>> dt.astimezone().strftime('%Y-%m-%d %H:%M:%S%z (%Z)')
'2015-11-27 00:29:06-0500 (EST)'

注:いいえ、UTCオフセットの:およびESTのタイムゾーンの省略形は、ISO 8601の時刻形式の一部ではありません。それはユニークではありません。

同じライブラリの異なるライブラリ/異なるバージョンは、同じ日付/タイムゾーンに対して異なるタイムゾーン規則を使用することがあります。それが将来の日付であるならば、そのとき規則はまだ知られていないかもしれません。つまり、使用するルールによっては、同じUTC時間が異なる現地時間に対応する場合があります。ISO8601形式で時間を保存すると、UTC時間とに対応する現地時間が保持されます。プラットフォームで現在使用されているタイムゾーンの規則。規則が異なる場合は、別のプラットフォームで現地時間を再計算する必要があります。

15
jfs

ファイル作成時間を取得するにはos.statを使用し、フォーマットにはtime.strftimetime.timezoneの組み合わせを使用する必要があります。

>>> import time
>>> import os
>>> t = os.stat('C:/Path/To/File.txt').st_ctime
>>> t = time.localtime(t)
>>> formatted = time.strftime('%Y-%m-%d %H:%M:%S', t)
>>> tz = str.format('{0:+06.2f}', float(time.timezone) / 3600)
>>> final = formatted + tz
>>> 
>>> final
'2008-11-24 14:46:08-02.00'
13
Max Shawabkeh

ISO 8601ではT以外の区切り文字なしのコンパクトな表現が許されているので、このワンライナーを使って迅速なタイムスタンプ文字列を取得するのが好きです。

>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%S.%fZ")
'20180905T140903.591680Z'

マイクロ秒が不要な場合は、.%fの部分を省略してください。

>>> datetime.datetime.utcnow().strftime("%Y%m%dT%H%M%SZ")
'20180905T140903Z'

現地時間の場合:

>>> datetime.datetime.now().strftime("%Y%m%dT%H%M%S")
'20180905T140903'
9
Jim Hunziker

私が間違っている場合は訂正してください(私は違います)が、UTCからのオフセットは夏時間によって変わります。だからあなたは使うべきです

tz = str.format('{0:+06.2f}', float(time.altzone) / 3600)

私はまた記号が異なるべきであると思います:

tz = str.format('{0:+06.2f}', -float(time.altzone) / 3600)

私は間違っているかもしれませんが、私はそうは思いません。

4

私はJarekに同意します、そしてさらに私はISOオフセットセパレータ文字がコロンであることに注意します、それで私は最終的な答えがであるべきだと思います:

isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':')
2
mattbornski

私はこの機能を開発しました:

def iso_8601_format(dt):
    """YYYY-MM-DDThh:mm:ssTZD (1997-07-16T19:20:30-03:00)"""

    if dt is None:
        return ""

    fmt_datetime = dt.strftime('%Y-%m-%dT%H:%M:%S')
    tz = dt.utcoffset()
    if tz is None:
        fmt_timezone = "+00:00"
    else:
        fmt_timezone = str.format('{0:+06.2f}', float(tz.total_seconds() / 3600))

    return fmt_datetime + fmt_timezone
0
Andre Avilla