获取TZ从字符串偏移(Get tz offset from string)

2019-10-18 23:15发布

我有个约会是在本地时间:

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

另有价值TZ:

timezone_offset: "GMT-0800"

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

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

我想要实现的date与TZ信息ISO格式,并得到的结果:

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

一些接近: parse(date,tzinfos=??).isoformat() 我怎样才能从字符串的tzinfo timezone_offset

Answer 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取自datetime文档 :

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模块 :

>>> 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'


Answer 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'
>>> 

第二种方法的主要优点是它使得你的时间字符串“时区意识”。 从文档 :

有两种类型的日期和时间的对象:“天真”和“知道”。 这种区分是指对象是否具有时区,夏令时,或其他种类的算法或政治时间调整的任何概念。 无论是天真的DateTime对象代表协调世界时(UTC),本地时间,或时间在一些其它时区是纯粹的补充方案,就像它是由一个特定的数字是否代表米,英里,或质量程序。 天真datetime对象很容易理解和合作,在无视现实的某些方面的成本。

希望这可以帮助!



文章来源: Get tz offset from string