2012-04-21 29 views
27

我用: 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')在1900年前使用datetime.strftime()? ( 「規定年份> = 1900」)

但我有1601的時間,所以錯誤顯示: ValueError: year=1601 is before 1900; the datetime strftime() methods require year >= 1900

我使用python2.7,我怎樣才能使它?非常感謝!

+4

您將需要一個外部庫。 mxDateTime確實可以追溯到第0年。http://www.egenix.com/products/python/mxBase/mxDateTime/doc/ – 2012-04-21 23:36:13

回答

13

你可以做到以下幾點:

>>> 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(未測試)

10

isoformat方法接受一個參數指定字符(s)除日期部分從它的表示中的日期時間obj的時間部分開始。因此:

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

應該這樣做。 此外,如果你想刪除微秒,你可以操作分割。

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

有不同的方法來改變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年之前另外有錯誤,預3.2版本解釋歲之間099,如在19692068之間。來自3.3的Python版本向前支持datetime(和time.strftime中的負向年份)的所有正向年份,並且time.strftime不會在099之間做任何年份的映射。

原來Python bug解釋說,他們決定,這是在Python 2.7的功能(可能因爲它避免了缺乏對這些日期系統strftime支持),然後逐步在Python 3系列上它的工作,通過重新實現的功能。

+0

我試過了virtualtime monkeypatcher,但是我找不到任何文檔,我也弄不清楚我需要做些什麼來實現它。 – 2017-09-27 17:24:20

+0

我使用'sudo pip install virtualtime'來安裝它,然後用'import virtualtime'導入它並調用'virtualtime.enable()'。工作很棒! – nickb 2018-01-21 21:11:56

6

我建議使用arrow(這是對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' 
相關問題