从字符串获取tz偏移量

时间:2013-11-12 14:54:50

标签: python datetime python-dateutil python-datetime

我有一个当地时间的日期:

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?

2 个答案:

答案 0 :(得分:0)

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

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

  

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

希望这有帮助!

答案 1 :(得分:0)

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