dateutil.parser.parse() 和丢失的时区信息
Posted
技术标签:
【中文标题】dateutil.parser.parse() 和丢失的时区信息【英文标题】:dateutil.parser.parse() and lost timezone information 【发布时间】:2014-09-04 03:40:55 【问题描述】:我正在尝试 dateutil.parser.parse()
使用时区感知日期时间解析默认的 str(datetime.datetime.now())
输出。但是,parse()
似乎丢失了时区信息,并将其替换为本地时区。以下是 IPython 输出:
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
在猜测日期格式时会进行一些启发式操作,这里可能会出错。
如何给出准确的日期时间格式来解析时区感知的日期时间?
更好 - 如果知道格式如何仅使用 Python stdlib 解析此日期时间,而不依赖于 dateutil?
【问题讨论】:
我知道USE_TZ
- 但是这个问题是关于解析日期和dateutil
行为,而不是关于Django。
那你为什么用django.util.timezone
?
我想用时区生成一个日期时间。这是一种最简单的方法。我想我的问题很具体 - 请告诉我问题中有什么可以改进的地方。
你问题的前提是错误的——datetime.datetime.now()
没有给你一个时区感知对象;因此,当您执行str(datetime.datetime.now())
时,字符串中没有时区信息。您的问题基本上是“如何将表示具有时区偏移的日期和时间的字符串解析为日期时间对象”?
Np。它发生在每个人身上:)
【参考方案1】:
timezone.now
will give you an aware datetime object if USE_TZ
is true。你不需要进一步解析它。
在本例中,USE_TZ 为 True,时区设置为 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'
【讨论】:
请看我的评论 - 这个问题与 Django 无关,这个答案与问题完全无关。以上是关于dateutil.parser.parse() 和丢失的时区信息的主要内容,如果未能解决你的问题,请参考以下文章
python统一转换日期格式dateutil.parser.parse
第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等