517

ファイルがあります。Pythonでは、作成時間を取得し、東部標準時(ET)で作成されたという事実を維持しながら、 ISO時間(ISO 8601)文字列 に変換したいと思います。

ファイルのctimeを取得して、東部標準時を示すISO時間文字列に変換するにはどうすればよいですか(必要に応じて夏時間を考慮に入れます)。

4

15 に答える 15

881

ISO 8601 にローカル:

import datetime
datetime.datetime.now().isoformat()
>>> 2020-03-20T14:28:23.382748

UTC から ISO 8601:

import datetime
datetime.datetime.utcnow().isoformat()
>>> 2020-03-20T01:30:08.180856

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

import datetime
datetime.datetime.now().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:30:43

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

import datetime
datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()
>>> 2020-03-20T01:31:12.467113+00:00

UTC から ISO 8601 へのマイクロ秒なしの Local TimeZone 情報 (Python 3):

import datetime
datetime.datetime.now().astimezone().replace(microsecond=0).isoformat()
>>> 2020-03-20T14:31:43+13:00

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

import datetime
datetime.datetime.now().astimezone().isoformat()
>>> 2020-03-20T14:32:16.458361+13:00

astimezone()on utc timeを使用するとバグがあることに注意してください。これは間違った結果になります:

datetime.datetime.utcnow().astimezone().isoformat() #Incorrect result

Python 2 については、pytzを参照して使用してください。

于 2015-01-26T09:14:36.043 に答える
74

XSD日時形式に変換するために使用するものは次のとおりです。

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

XSD 日時形式 ( xs:dateTime) を探しているときに、この質問に遭遇しました。からマイクロ秒を削除する必要がありましたisoformat

于 2015-11-30T19:04:53.620 に答える
62

ISO 8601 時間表現

国際標準 ISO 8601 では、日付と時刻の文字列表現について説明しています。この形式の 2 つの簡単な例を次に示します。

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

(どちらも 2010 年 12 月 16 日を表します)、この形式では 1 秒未満の解決時間とタイム ゾーンの指定も可能です。もちろん、この形式は Python 固有のものではありませんが、日付と時刻を移植可能な形式で保存するのに適しています。この形式に関する詳細は、Markus Kuhn エントリにあります。

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

この表現で現在の時刻を取得する 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)

参考文献

于 2010-12-16T16:20:25.253 に答える
50

ドキュメントで 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'
于 2013-02-28T18:19:18.120 に答える
21

ISO 8601 時刻形式はタイム ゾーン名を格納せず、対応する 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'

このコードは、ローカル タイムゾーンが 東部標準時(ET) であり、システムが指定された POSIX タイムスタンプ ( ) に対して正しい UTC オフセットを提供していることts、つまり、Python がシステム上の過去のタイムゾーン データベースにアクセスできるか、またはタイム ゾーンが特定の日に同じルール。

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

>>> 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 時間が異なる現地時間に対応する場合があります。ISO 8601 形式で時刻を保存すると、UTC 時間と、プラットフォームで使用されている現在のタイム ゾーン ルールに対応する現地時間が保持されます。 . ルールが異なる場合は、別のプラットフォームで現地時間を再計算する必要がある場合があります。

于 2015-11-28T11:31:31.330 に答える
18

os.statファイルの作成時間と、フォーマットのtime.strftimeとの組み合わせを取得するために使用する必要があります。time.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'
于 2010-01-27T23:31:08.017 に答える
4

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

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

また、記号は異なる必要があると思います。

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

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

于 2010-06-08T08:45:57.730 に答える
2

私は Jarek に同意します。さらに、ISO オフセット区切り文字はコロンであることに注意してください。したがって、最終的な答えは次のようになるはずです。

isodate.datetime_isoformat(datetime.datetime.now()) + str.format('{0:+06.2f}', -float(time.timezone) / 3600).replace('.', ':')
于 2010-10-27T18:58:49.283 に答える
2

estaniの優れた回答に小さなバリエーションを追加する

TimeZone を使用し、マイクロ秒情報を使用しないISO 8601 のローカル(Python 3):

import datetime, 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(microsecond=0, tzinfo=datetime.timezone(offset=utc_offset)).isoformat()

サンプル出力:

'2019-11-06T12:12:06-08:00'

Dateこの出力が Javascriptと C#の両方で解析できることをテスト済みDateTime/DateTimeOffset

于 2019-11-06T17:20:22.933 に答える
1

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

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
于 2016-11-08T10:04:08.393 に答える
-6
import datetime, time    
def convert_enddate_to_seconds(self, ts):
    """Takes ISO 8601 format(string) and converts into epoch time."""
     dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\
                datetime.timedelta(hours=int(ts[-5:-3]),
                minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
    seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
    return seconds 

>>> import datetime, time
>>> ts = '2012-09-30T15:31:50.262-08:00'
>>> dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
>>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
>>> seconds
1348990310.26
于 2012-08-29T18:39:57.227 に答える