2012-04-21 32 views
27

tôi đã sử dụng: 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')Sử dụng datetime.strftime() vào những năm trước 1900? ("Đòi hỏi năm> = 1900")

Nhưng tôi có thời gian của năm 1601, vì vậy chương trình báo lỗi: ValueError: year=1601 is before 1900; the datetime strftime() methods require year >= 1900

tôi đã sử dụng python2.7, làm thế nào tôi có thể làm cho nó ? Cảm ơn rất nhiều!

+4

Bạn sẽ cần thư viện bên ngoài. mxDateTime có từ năm 0. http://www.egenix.com/products/python/mxBase/mxDateTime/doc/ –

Trả lời

13

Bạn có thể làm như sau:

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

Bây giờ nếu bạn muốn có chính xác định dạng tương tự như trên:

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

Không phải là có vẻ là một bản vá cho strftime để sửa lỗi này hành vi here (không được kiểm tra)

10

phương thức isoformat chấp nhận tham số xác định (các) ký tự chia phần ngày từ phần thời gian của một obj datetime trong biểu diễn của nó. Do đó:

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

nên làm điều đó. Hơn nữa, nếu bạn muốn loại bỏ micro giây, bạn có thể thao tác chia tách.

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

Có nhiều cách khác nhau để thay đổi strftime để nó xử lý ngày trước 1900:

  • Có một recipe at ASPN cung cấp cho bạn một strftime phương pháp riêng biệt mà bạn có thể gọi với một đối tượng date: aspn_recipe.strftime(dt, fmt) nếu bạn tự thiết lập mô-đun trong một mô-đun
  • @stephen-rumbalski said, gói bên ngoài mxDateTime hỗ trợ điều này; nhưng đó là sử dụng hệ thống đối tượng ngày hoàn toàn khác
  • Kể từ phiên bản 1.5, gói virtualtime sẽ vá cả hai time.strftimedatetime.datetime.strftime để hoạt động như trong Python 3.3 +. Bạn có thể tận dụng điều này mà không bật các chức năng thời gian ảo khác. (Disclaimer: Tôi làm việc trên gói này)

Lưu ý rằng Python 2.7, 3.03.1 có lỗi trước năm 1900, Python 3.2 có lỗi trước năm 1000. Thêm vào đó, trước 3.2 phiên bản giải thích năm giữa 099 ở giữa 19692068. Các phiên bản Python từ 3.3 trở đi hỗ trợ tất cả các năm dương trong datetime (và năm âm trong time.strftime) và time.strftime không thực hiện bất kỳ phép lập bản đồ năm nào giữa 099.

Bản gốc Python bug giải thích rằng họ đã quyết định rằng đây là một tính năng trong Python 2.7 (có lẽ vì nó tránh thiếu sự hỗ trợ hệ thống strftime cho những ngày tháng), và sau đó dần dần làm việc trên nó trong loạt Python 3, bởi reimplementing chức năng.

+0

Tôi đã thử trình thu thập thông tin ảo, nhưng tôi không thể tìm thấy bất kỳ tài liệu nào và tôi không thể tìm ra những gì tôi cần làm để làm cho nó đi. –

+0

Tôi đã sử dụng 'sudo pip install virtualtime' để cài đặt nó, sau đó nhập nó với' import virtualtime' và được gọi là 'virtualtime.enable()'. Làm việc tuyệt vời! – nickb

6

tôi khuyên bạn nên sử dụng arrow (đó là một gói phần mềm trừu tượng trên datetime và dateutil), nó thực sự dễ dàng để xử lý tất cả các loại của các đối tượng datetime, ngay cả trong Python 2.6/7.x và với các ngày trước 1900.

Ví dụ:

>>> 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' 
Các vấn đề liên quan