Way*_*ner 8 python timezone datetime python-dateutil
>>> import dateutil.parser, dateutil.tz as tz
>>> dateutil.parser.parse('2017-08-09 10:45 am').replace(tzinfo=tz.gettz('America/New_York'))
datetime.datetime(2017, 8, 9, 10, 45, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York'))
Run Code Online (Sandbox Code Playgroud)
这真的是我们应该为解析设置默认时区的方式吗?我已经阅读了解析器和示例的文档,但似乎找不到任何说“这是为 dateutil.parser.parse 设置默认时区的方法”,甚至是类似内容的内容。
因为虽然这有效,但如果提供了区域,在某些情况下它会做错事。这是否意味着我们应该这样做?
>>> d = dateutil.parser.parse('2017-08-09 10:45 am +06:00')
>>> d = d.replace(tzinfo=d.tzinfo or tz.gettz('America/Chicago'))
Run Code Online (Sandbox Code Playgroud)
因为它也很笨重。
解析时设置默认时区的推荐方法是什么?
基本上有两种“正确”的方法可以做到这一点。您可以看到这是作为问题跟踪器上的问题#94提出dateutil的,并且“设置默认时区”被确定为超出范围,因为这可以通过解析器返回的信息轻松完成无论如何(因此无需将其构建到解析器本身中)。这两种方式是:
提供default具有时区的日期。如果你不关心default日期是什么,你可以指定一些日期文字并完成它。如果您希望行为与dateutil的默认行为基本相同(替换“今天午夜的日期”中缺少的元素),您必须有一些样板:
from datetime import datetime, time
from dateutil import tz, parser
default_date = datetime.combine(datetime.now(),
time(0, tzinfo=tz.gettz("America/New_York")))
dt = parser.parse(some_dt_str, default=default_date)
Run Code Online (Sandbox Code Playgroud)使用您的第二种方法.replace:
from dateutil import parser
def my_parser(*args, default_tzinfo=tz.gettz("America/New_York"), **kwargs):
dt = parser.parse(*args, **kwargs)
return dt.replace(tzinfo=dt.tzinfo or default_tzinfo)
Run Code Online (Sandbox Code Playgroud)最后一个可能比第一个更干净,但是如果在紧密循环中运行,性能会略有下降(因为第一个只需要创建一次默认日期),但是dateutil解析器实际上很慢,所以额外的日期如果你在一个紧密的循环中运行它,构造可能是你的问题中最少的。
| 归档时间: |
|
| 查看次数: |
10562 次 |
| 最近记录: |