使用箭头从带有时区的字符串中解析日期和时间
Posted
技术标签:
【中文标题】使用箭头从带有时区的字符串中解析日期和时间【英文标题】:Parse date and time from string with time zone using Arrow 【发布时间】:2015-03-21 03:40:20 【问题描述】:我有
import arrow
s = '2015/12/1 19:00:00'
tz = 'Asia/Hong_Kong'
如何使用 Arrow 解析它,以便获得时区 tz
的 Arrow 对象?以下默认为 UTC 时间。
In [30]: arrow.get(s, 'YYYY/M/D HH:mm:ss')
Out[30]: <Arrow [2015-12-01T19:00:00+00:00]>
我知道.to
函数,但它会转换时区,但不允许我更改时区。
【问题讨论】:
在箭头文档中,我看到构造函数的工作方式如下:“class arrow.arrow.Arrow(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo =无)”。这足以解决您的问题吗?它实际上返回一个带有你想要的 tz 的箭头对象。 【参考方案1】:试试这个:
arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo=dateutil.tz.gettz(tz))
【讨论】:
这行得通!只是出于好奇,是否可以对 pytz 做同样的事情?我得到了一些奇怪的结果:In [7]: arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo=pytz.timezone(tz)) Out[7]: <Arrow [2015-12-01T19:00:00+07:37]>
不确定,但我认为箭头与 dateutil 对齐比 pytz 更好。
@mchangun:如果您不想默默地忽略错误,那么解析时间的正确方法:pytz.timezone('Asia/Hong_Kong').localize(datetime.strptime(s, '%Y/%m/%d %H:%M:%S'), is_dst=None)
@mchangun:顺便说一句,我看到即使经过两年的发展arrow
still fails to convert utc datetime to a named timezone, convert utc time to local timezone, and round-trip timestamp -> named timezone -> utc
@mchangun:“更好”取决于您的应用程序。我使用pytz
,但对于大多数应用程序来说它可能太低级了。尽管您只需要了解 pytz 为何引入localize()
、normalize()
方法,以正确使用它。【参考方案2】:
我还没有资格添加评论,只是想与 timezone str 表达式分享一个更简单的答案版本。
s = '2015/12/1 19:00:00'
tz = 'Asia/Hong_Kong'
arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo=tz)
或只是当地时区:
arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo='local')
或指定的 ISO-8601 样式:
arrow.get(s, 'YYYY/M/D HH:mm:ss').replace(tzinfo='+08:00')
【讨论】:
【参考方案3】:根据当前的documentation,您还可以为arrow.get()
提供默认时区,例如:
s = '2015/12/1 19:00:00'
tz = 'Asia/Hong_Kong'
arrow.get(s, tzinfo=tz)
但是,截至目前(0.12.1 版),存在一个缺点,即它不适用于基于字符串的日期解析。幸运的是,这个has been fixed,所以下一版本的 Arrow 将集成这个修复。
【讨论】:
【参考方案4】:从 0.10.0 开始,这对我有用:
import arrow
s = '2015/12/1 19:00:00'
tz = 'Asia/Hong_Kong'
arrow.get(s, 'YYYY/M/D HH:mm:ss', tzinfo=tz)
# <Arrow [2015-12-01T19:00:00+08:00]>
但是,arrow.get('2018-01-29 14:46', tzinfo='US/Central')
(即没有格式字符串)会忽略 tzinfo
参数。
【讨论】:
以上是关于使用箭头从带有时区的字符串中解析日期和时间的主要内容,如果未能解决你的问题,请参考以下文章