1

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

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

4

2 回答 2

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

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

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

希望这可以帮助!

于 2013-11-12T15:19:16.660 回答
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'

FixedOffsetdatetime文档中获取的位置:

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'
于 2013-11-13T22:56:44.483 回答