在1900年之前使用datetime.strftime()? (“要求年份> = 1900”)

时间:2012-04-21 23:32:14

标签: python datetime strftime

我用过: 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 个答案:

答案 0 :(得分:14)

您可以执行以下操作:

>>> 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(未经测试)

答案 1 :(得分:11)

isoformat方法接受一个参数,该参数指定将日期部分与日期时间obj的时间部分划分的字符。因此:

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

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

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

答案 2 :(得分:9)

有多种方法可以改变strftime以便它处理1900年以前的日期:

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

请注意,Python 2.73.03.1在1900年之前有错误,Python 3.2在1000年之前有错误。此外,前{{1}版本将3.20之间的年份解释为991969之间的年份。 2068以后的Python版本支持3.3中的所有正年(以及datetime中的负年),time.strftime不会对time.strftime之间的年份进行任何映射}和0

原始Python bug解释说他们认为这是Python 2.7中的一个功能(可能是因为它避免了对这些日期缺乏系统99支持),然后在Python中逐步使用它3系列,重新实现功能。

答案 3 :(得分:7)

我建议使用arrow(这是datetime和dateutil上的抽象包),它很容易处理各种日期时间对象,即使在Python 2.6 / 7.x和1900之前的日期也是如此。< / p>

例如:

stream.read(buffer);