【问题标题】:Get tz offset from string从字符串中获取 tz 偏移量
【发布时间】:2013-11-12 14:54:50
【问题描述】:

我的日期是当地时间:

date: "2013-12-02 22:00:00"

还有一个 tz 值:

timezone_offset: "GMT-0800"

如果我:dateutil.parser.parse(date).isoformat() 我会得到:

"2013-12-02T22:00:00+0000"

我想使用 tz 信息以 ISO 格式实现 date 并获得以下结果:

"2013-12-02T22:00:00-0800"

接近于:parse(date,tzinfos=??).isoformat() ?如何从字符串 timezone_offset 中获取 tzinfo?

【问题讨论】:

标签: python datetime python-dateutil python-datetime


【解决方案1】:
>>> from dateutil.parser import parse
>>> dt = parse("2013-12-02 22:00:00" + "GMT+0800")
>>> dt.isoformat()
'2013-12-02T22:00:00-08:00'

注意:符号是相反的。

你也可以只使用 stdlib:

>>> from datetime import datetime
>>> dt = datetime.strptime("2013-12-02 22:00:00", "%Y-%m-%d %H:%M:%S")
>>> dt = dt.replace(tzinfo=FixedOffset(-8*60, "GMT+0800"))
>>> dt.isoformat()
'2013-12-02T22:00:00-08:00'

FixedOffset is taken from datetime docs:

from datetime import tzinfo, timedelta

class FixedOffset(tzinfo):
    """Fixed offset in minutes east from UTC."""

    def __init__(self, offset, name):
        self.__offset = timedelta(minutes = offset)
        self.__name = name

    def utcoffset(self, dt):
        return self.__offset

    def tzname(self, dt):
        return self.__name

    def dst(self, dt):
        return timedelta(0)

这里使用pytz module也是一样的:

>>> from datetime import datetime
>>> import pytz
>>> dt = datetime.strptime("2013-12-02 22:00:00", "%Y-%m-%d %H:%M:%S")
>>> dt = pytz.timezone('Etc/GMT+8').localize(dt)
>>> dt.isoformat()
'2013-12-02T22:00:00-08:00'

【讨论】:

    【解决方案2】:

    您可以使用以下两种方法:

    >>> import datetime
    >>> dtnow = datetime.datetime.now();dtutcnow = datetime.datetime.utcnow()
    >>> dtnow
    datetime.datetime(2013, 11, 12, 9, 10, 48, 404000)
    >>> dtutcnow
    datetime.datetime(2013, 11, 12, 15, 10, 48, 404000)
    >>> delta = dtnow - dtutcnow
    >>> delta
    datetime.timedelta(-1, 64800)
    >>> hh,mm = divmod((delta.days * 24*60*60 + delta.seconds + 30) // 60, 60)
    >>> hh,mm
    (-6, 0)
    >>> "%s%+02d:%02d" % (dtnow.isoformat(), hh, mm)
    '2013-11-12T09:10:48.404000-6:00'
    

    或者这个:

    >>> import datetime, pytz # 3rd Party
    >>> datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')
    '2013-11-12T09:15:20.688000-0600'
    >>> 
    

    第二种方法的主要优点是它使您的时间字符串“时区感知”。来自docs

    有两种日期和时间对象:“naive”和“aware”。 这种区别是指对象是否具有任何时间概念 区域、夏令时或其他类型的算法或政治 时间调整。一个朴素的日期时间对象是否代表 协调世界时 (UTC)、当地时间或其他时间 时区完全取决于程序,就像它取决于程序一样 一个特定的数字是代表米、英里还是质量。幼稚的 datetime 对象易于理解和使用,但代价是 忽略现实的某些方面。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2017-08-01
      • 2015-12-02
      相关资源
      最近更新 更多