35

我用了 : 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,怎么弄?非常感谢!

4

4 回答 4

21

您可以执行以下操作:

>>> 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修复此行为的补丁(未测试)

于 2012-04-21T23:53:14.287 回答
14

isoformat方法接受一个参数,该参数指定在其表示中将日期部分与日期时间 obj 的时间部分分开的字符。所以:

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

应该这样做。此外,如果您想删除微秒,您可以进行拆分。

>>> utctime.isoformat(" ").split(".")[0]
'1601-01-01 00:00:00'
于 2012-12-01T17:18:26.107 回答
11

有多种更改方法strftime可以处理 1900 年之前的日期:

  • ASPN有一个秘诀,它为您提供了一个单独的strftime方法,您可以使用日期对象调用该方法:aspn_recipe.strftime(dt, fmt)如果您自己在模块中设置它
  • 正如@stephen-rumbalski 所说,外部mxDateTime包支持这一点;但这是使用完全不同的日期对象系统
  • 从 version开始1.5virtualtime包将同时修补time.strftimedatetime.datetime.strftime在 Python 3.3+ 中的行为。您可以在不启用其他虚拟时间功能​​的情况下利用这一点。(免责声明:我在这个包上工作

请注意 Python 2.73.0并且3.1在 1900 年之前3.2有错误,Python 在 1000 年之前有错误。此外,预3.2版本将介于和之间的年份解释为介于0和之间。以后的 Python 版本支持 中的所有正年份(以及 中的负年份),并且不会在和之间进行任何年份映射。99196920683.3datetimetime.strftimetime.strftime099

最初的Python 错误解释说,他们认为这是 Python 2.7 中的一个特性(大概是因为它避免了strftime对这些日期缺乏系统支持),然后通过重新实现功能逐渐在 Python 3 系列中对其进行处理。

于 2015-08-25T14:24:21.190 回答
8

我建议使用箭头(它是 datetime 和 dateutil 的抽象包),它非常容易处理各种 datetime 对象,即使在 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'
于 2016-02-24T16:43:05.770 回答