2014-07-14 155 views
6

我想用dateutil.parser.parse()来解析使用时区感知日期时间的默认str(datetime.datetime.now())输出。但是,parse()似乎丢失了时区信息并将其替换为当地时区。下面是IPython的输出:dateutil.parser.parse()和丢失的时区信息

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 

据我的理解dateutil猜测的日期格式时做一些heurestics,它可能去错在这里。

  • 如何给出确切的日期时间格式来解析时区感知的日期时间?

  • 甚至更​​好 - 如果格式已知如何解析此日期时间只使用Python stdlib,没有dateutil依赖?

+0

我知道USE_TZ'的' - 但是这个问题是关于分析日期和'dateutil'行为,不是Django的。 –

+1

那么你为什么使用'django.util.timezone'? –

+0

我想用时区生成日期时间。这是最简单的方法。我认为我的具体问题非常具体 - 请告诉我,如果问题中有什么可以改进的话。 –

回答

-2

timezone.nowwill give you an aware datetime object if USE_TZ is true。你不需要进一步解析它。

在这个例子中,USE_TZ是真的,时区设置为UTC:

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

至于dateutil推移,它会正确解析您的字符串:

>>> 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()) 

你可以看到它选择正确的时区(在这种情况下是UTC)。

default format specifiers只接受+0000作为偏移格式与%z,或三个字母的时区名称与%Z;但你不能用它来解析,只有格式

>>> 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

请参阅我的评论 - 这个问题不是关于Django的,这个答案与问题完全无关。 –