我有一个当地时间的日期:
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?
答案 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'