web-dev-qa-db-ja.com

1900より前の年にdatetime.strftime()を使用しますか? ( "必要な年> = 1900")

私が使用した:utctime = datetime.datetime(1601,1,1) + datetime.timedelta(microseconds = tup[5]) last_visit_time = "Last visit time:"+ utctime.strftime('%Y-%m-%d %H:%M:%S')

しかし、私は1601の時間があるので、エラーが表示されます:ValueError: year=1601 is before 1900; the datetime strftime() methods require year >= 1900

私はpython2.7を使用しましたが、どうすれば作成できますか?どうもありがとう!

32
Alex

次のことができます。

>>> utctime.isoformat()
'1601-01-01T00:00:00.000050'

上記とまったく同じ形式にしたい場合:

iso = utctime.isoformat()
tokens = iso.strip().split("T")
last_visit_time = "Last visit time: %s %s" % (tokens[0], tokens[1].strip().split(".")[0])

この動作を修正するstrftimeのパッチがあるようではない here (テストされていません)

16
Charles Menguy

isoformatメソッドは、その表現で日付時刻objの時刻部分から日付部分を分割する文字を指定するパラメーターを受け入れます。したがって:

>>> utctime.isoformat(" ")
'1601-01-01 00:00:00.000050'

それを行う必要があります。さらに、マイクロ秒を削除したい場合は、スプリットを操作できます。

>>> utctime.isoformat(" ").split(".")[0]
'1601-01-01 00:00:00'
11

strftimeを変更して1900年より前の日付を処理するには、さまざまな方法があります。

  • ASPNでのレシピ があります。これにより、日付オブジェクトで呼び出すことができる個別のstrftimeメソッドが提供されます:aspn_recipe.strftime(dt, fmt)自分でモジュールに設定した場合
  • @ stephen-rumbalskiが言った のように、外部の mxDateTime パッケージがこれをサポートしています。しかし、それは完全に異なる日付オブジェクトシステムを使用しています
  • バージョン_1.5_以降、 virtualtime パッケージは_time.strftime_と_datetime.datetime.strftime_の両方にパッチを適用し、Python _3.3_ +。他の仮想時間関数を有効にしなくてもこれを利用できます(免責事項:私はこのパッケージに取り組んでいます

Python _2.7_、_3.0_および_3.1_には、1900年より前にエラーがあることに注意してください。Python _3.2_には、1000年より前のエラーがあります。さらに、pre _3.2_バージョンは、_0_と_99_の間の年を_1969_と_2068_の間として解釈します。Python _3.3_以降のバージョンは、datetimeのすべての正の年(および_time.strftime_の負の年)をサポートし、_time.strftime_は、 _0_と_99_の間の年。

オリジナルの Pythonバグ は、これがPython 2.7の機能であると判断したことを説明しています(おそらく、これらの日付に対するシステムstrftimeサポートの欠如を回避したためです) )、そしてPython 3シリーズでは、機能を再実装することで徐々に取り組んでいきました。

9
David Fraser

arrow (datetimeとdateutilの抽象パッケージ)を使用することをお勧めします。Python 2.6/7。 xおよび1900より前の日付。

例えば:

>>> import arrow

>>> in_date_str = "1853-10-30T13:36:41.942623+00:00"
>>> in_date_obj = arrow.get(crea)
>>> print(in_date_obj)
arrow[1853-10-30T13:36:41.942623+00:00]>

# basic formatting
>>> in_date_obj.format()
u'1853-10-30 13:36:41-00:00'

# advanced formatting
>>> in_date_obj.format("dddd D MMMM YYYY", "fr_FR")
u'Dimanche 30 Octobre 1853'

# humanized delta
>>> in_date_obj.humanize()
u'162 years ago'
# easy localization handling
>>> in_date_obj.humanize(locale="fr_FR")
u'il y a 162 ans'
8
Guts