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

Ale*_*lex 31 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,我该怎么做?非常感谢!

Cha*_*guy 17

您可以执行以下操作:

>>> utctime.isoformat()
'1601-01-01T00:00:00.000050'
Run Code Online (Sandbox Code Playgroud)

现在,如果您想要具有与上面完全相同的格式:

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

不是说有似乎是一个补丁strftime修复这个行为在这里(未测试)


小智 12

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

>>> utctime.isoformat(" ")
'1601-01-01 00:00:00.000050'
Run Code Online (Sandbox Code Playgroud)

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

>>> utctime.isoformat(" ").split(".")[0]
'1601-01-01 00:00:00'
Run Code Online (Sandbox Code Playgroud)


Dav*_*ser 9

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

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

请注意Python 2.7,3.0并且3.1在1900年之前有错误,Python 3.2在1000年之前有错误.此外,预3.2版本解释之间099之间的年份19692068.从3.3前面开始的Python版本支持所有正面年份datetime(和负面年份time.strftime),并且time.strftime不会在0和之间进行任何年份的映射99.

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

  • 我使用 sudo pip install virtualtime 安装它,然后使用 import virtualtime 导入它并调用 virtualtime.enable() 。效果很好! (2认同)

小智 8

我建议使用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'
Run Code Online (Sandbox Code Playgroud)