2014-07-14 17 views
6

Tôi đang cố gắng để dateutil.parser.parse() để phân tích cú pháp mặc định str(datetime.datetime.now()) đầu ra bằng cách sử dụng thời gian biểu nhận biết múi giờ. Tuy nhiên, parse() dường như mất thông tin múi giờ và thay thế bằng múi giờ địa phương. Dưới đây là sản phẩm IPython:dateutil.parser.parse() và mất thông tin múi giờ

In [1]: from django.utils.timezone import now 
In [3]: import dateutil 
In [4]: t = now() 
In [6]: print t 
2014-07-14 08:51:49.123342+00:00 

In [7]: st = unicode(t) 
In [8]: print dateutil.parser.parse(st) 
2014-07-14 08:51:49.123342+02:00 

Theo tôi hiểu dateutil hiện một số heurestics khi đoán định dạng ngày và nó có thể đi sai ở đây.

  • Cách cung cấp định dạng ngày giờ chính xác để phân tích cú pháp thời gian biểu nhận biết múi giờ?

  • Thậm chí tốt hơn - nếu định dạng được biết cách phân tích datetime này chỉ sử dụng Python stdlib, không phụ thuộc vào dateutil?

+0

Tôi biết của 'USE_TZ' - tuy nhiên câu hỏi này là về ngày phân tích cú pháp và 'dateutil' hành vi, không phải về Django. –

+1

Vậy tại sao bạn sử dụng 'django.util.timezone'? –

+0

Tôi muốn tạo một datetime với múi giờ. Đó là loại cách dễ nhất. Tôi nghĩ rằng tôi đã khá cụ thể những gì tôi đã yêu cầu - xin vui lòng cho tôi biết nếu có bất cứ điều gì trong câu hỏi những gì có thể được cải thiện. –

Trả lời

-2

timezone.nowwill give you an aware datetime object if USE_TZ is true. Bạn không cần phân tích thêm nữa.

Trong ví dụ này, USE_TZ là True, và múi giờ được đặt thành UTC:

>>> from django.utils import timezone as djtz 
>>> i = djtz.now() 
>>> type(i) 
<type 'datetime.datetime'> 
>>> i.tzinfo 
<UTC> 

As far as dateutil đi, nó sẽ phân tích chuỗi của bạn một cách chính xác:

>>> from dateutil.parser import parse 
>>> s = '2014-07-14 08:51:49.123342+00:00' 
>>> parse(s).tzinfo 
tzutc() 
>>> z = parse(s) 
>>> z 
datetime.datetime(2014, 7, 14, 8, 51, 49, 123342, tzinfo=tzutc()) 

Bạn có thể thấy nó chọn đúng múi giờ (UTC trong trường hợp này).

Chỉ default format specifiers chấp nhận +0000 làm định dạng bù trừ với %z hoặc tên múi giờ ba chữ cái với %Z; nhưng bạn không thể sử dụng để phân tích cú pháp , chỉ để định dạng:

>>> datetime.datetime.strptime('2014-07-14 08:51:49.123342+0000', '%Y-%m-%d %H:%M:%S.%f%z') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/_strptime.py", line 317, in _strptime 
    (bad_directive, format)) 
ValueError: 'z' is a bad directive in format '%Y-%m-%d %H:%M:%S.%f%z' 
>>> datetime.datetime.strftime(z, '%Z') 
'UTC' 
>>> datetime.datetime.strftime(z, '%z') 
'+0000' 
+1

Xin vui lòng xem bình luận của tôi - câu hỏi này không phải là về Django và câu trả lời này là hoàn toàn không liên quan đến câu hỏi. –