这是用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'))

这真的是我们设置解析默认时区的方式吗?我已经阅读了解析器的文档和示例,但似乎找不到任何内容,"这就是如何设置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'))

因为那也很笨重。

解析时,建议使用什么方法设置默认时区?

基本上有两种"正确"的方法。您可以看到,这是在dateutil的问题跟踪器上作为Issue#94提出的,并且"设置默认时区"被确定为超出范围,因为无论如何,这都可以通过解析器返回的信息轻松完成(因此无需将其构建到解析器本身中)。两种方式是:

  1. 提供具有时区的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)
    
  2. 使用.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)
    

最后一个可能比第一个稍微干净一点,但如果在紧密循环中运行,性能会略有下降(因为第一个只需要创建一次默认日期),但dateutil的解析器实际上相当慢,所以如果在紧密环圈中运行,额外的日期构造可能是最小的问题。

跳出Paul的评论-因为datetime必须在一年、一个月和一天中至少,所以dateutil已经有了它使用的默认值:

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2017, 10, 13, 15, 16, 13, 548750)
>>> dateutil.parser.parse('2017')
datetime.datetime(2017, 10, 13, 0, 0)

考虑到这一点,适当的选择是创建一个包含时区的default,它要么只是当前日期,要么是任何有意义的日期:

>>> dateutil.parser.parse('2017', default=datetime(2017, 10, 13, tzinfo=tz.gettz('America/New_York')))

当然,您可以将默认值存储为合理的东西,如default_datetime或其他东西,然后它就变成了:

>>> dateutil.parser.parse('2017', default=default_datetime)

相关内容

  • 没有找到相关文章

最新更新