【问题标题】:Python: how to correctly convert from a string date in a particular time zone?Python:如何从特定时区的字符串日期正确转换?
【发布时间】:2017-01-15 18:50:48
【问题描述】:

我从一个人那里得到YYYY-MM-DD HH:MM:SS 格式的输入,我知道它应该是洛杉矶当地时间。在 Python 中,如何将其转换为明确且正确的 datetime.datetime 对象?我知道在 DST 的秋季过渡期间输入不明确;只要是确定性的,我可以在那一小时内对日期进行任何选择。

这是我的尝试,我惊讶地发现它不起作用:

>>> import pytz
>>> from dateutil import parser as date_parser
>>> PACIFIC = pytz.timezone('US/Pacific')
>>> result = date_parser.parse('2016-08-01 00:00:00 FOO', tzinfos={'FOO': PACIFIC})
>>> result.utcoffset()
datetime.timedelta(-1, 57600)
>>> str(result)
'2016-08-01 00:00:00-08:00'

尽管要求 US/Pacific 并且这是一个夏季约会,但我得到的是 UTC-8 而不是 UTC-7。

【问题讨论】:

  • 这里的问题是pytz 时区不能像这样轻易附加。您需要在返回的 datetime.datetime 对象上使用 PACIFIC.localize()。如果您对所有日期都使用一个已知时区,请不要打扰tzinfos
  • 哦,还有,如果你知道日期和时区的格式,就不要用dateutil.parser,效率低,而且不强制格式(所以格式上的错误仍然可能产生一个日期,但一个不正确的)。使用datetime.strptime
  • 谢谢@Paul;你介意把它变成一个可行的例子作为答案吗?
  • 我可以,但我目前不在国内,所以可能需要几天时间。如果其他人想接受这个想法并坚持下去,我不会被冒犯。有关现有工作示例,请参阅 this page on documentation

标签: python datetime python-datetime python-dateutil


【解决方案1】:

您可以为此使用dateparser

import dateparser >>> dateparser.parse('2016-08-01 00:00:00', settings={'TIMEZONE': 'US/Pacific', 'TO_TIMEZONE': 'UTC'}) datetime.datetime(2016, 8, 1, 7, 0)

【讨论】:

    【解决方案2】:

    我找到了This,这可能会有所帮助。把它切碎一点,我得到了你正在寻找的 -0700。我不得不承认我不理解这个模块,所以我不能指出你可以在哪里快速修复你的代码(而且我在命令行上使用的 python 不多),但是下面的工作。

    import datetime
    import pytz
    
    def report(time):
        mytz = pytz.timezone('US/Pacific')
        dtformat = "%Y-%m-%d %H:%M"
        t = datetime.datetime.strptime(time, dtformat).replace(tzinfo=pytz.utc)
        print ("*****")
        print (t)
        print (mytz.normalize(t))
    
    report("2011-08-01 00:00")
    

    所以,希望这会有所帮助!

    【讨论】:

    • 这很有帮助,但给出了错误的答案。最后一个打印语句的结果是2011-07-31 17:00:00-07:00,但是我在找2011-08-01 00:00:00-07:00
    猜你喜欢
    • 1970-01-01
    • 2020-01-20
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2015-11-24
    • 2020-01-20
    相关资源
    最近更新 更多