App*_*rew 29 python python-2.7
我有一个时区与UTC的偏差(以秒为单位19800),并且还有字符串格式 - +0530.
我如何使用它们来创建tzinfo实例?我调查了pytz,但在那里我只能找到以时区名称作为输入的API.
Joe*_*Joe 28
如果可以,请查看优秀的dateutil包,而不是自己实现.
具体来说,tzoffset.它是一个固定的偏移tzinfo实例offset,以秒为单位进行初始化,这是您正在寻找的.
更新
这是一个例子.一定pip install python-dateutil要先跑.
from datetime import datetime
from dateutil import tz
# First create the tzinfo object
tzlocal = tz.tzoffset('IST', 19800)
# Now add it to a naive datetime
local = naive.replace(tzinfo=tzlocal)
# Or convert another timezone to it
utcnow = datetime.utcnow().replace(tzinfo=tz.tzutc())
now = utcnow.astimezone(tzlocal)
Run Code Online (Sandbox Code Playgroud)
我IST 从这里抬起名字.这个名字真的可以是任何东西.如果你偏离,请小心,因为如果你使用依赖于名称的代码,它可能会导致以后的错误.
顺便说一下,如果您预先设置了时区名称,并且操作系统支持它,则可以使用gettz:
# Replace the above with this
tzlocal = tz.gettz('IST')
Run Code Online (Sandbox Code Playgroud)
Ser*_*sta 16
Python标准库(8.1.6)说:
这意味着您必须为tzinfo提供自己的实现.例如 :
class UTC0530(datetime.tzinfo):
"""tzinfo derived concrete class named "+0530" with offset of 19800"""
# can be configured here
_offset = datetime.timedelta(seconds = 19800)
_dst = datetime.timedelta(0)
_name = "+0530"
def utcoffset(self, dt):
return self.__class__._offset
def dst(self, dt):
return self.__class__._dst
def tzname(self, dt):
return self.__class__._name
Run Code Online (Sandbox Code Playgroud)
用法:
tz = UTC0530()
d = datetime.datetime.now(tz)
d.isoformat()
Run Code Online (Sandbox Code Playgroud)
输出:
2015-01-27T20:19:41.257000+05:30
Run Code Online (Sandbox Code Playgroud)
你必须实现类的子datetime.tzinfo类.这里描述了一般指南,您还可以在其中找到自定义tzinfo实现的优秀示例.
这是一个例子(假设没有夏令时):
from datetime import tzinfo, timedelta, datetime
from pytz import UTC
class MyUTCOffsetTimezone (tzinfo):
def __init__(self, offset=19800, name=None):
self.offset = timedelta(seconds=offset)
self.name = name or self.__class__.__name__
def utcoffset(self, dt):
return self.offset
def tzname(self, dt):
return self.name
def dst(self, dt):
return timedelta(0)
now = datetime.now(tz=UTC)
print now
# -> 2015-01-28 10:46:42.256841+00:00
print now.astimezone(MyUTCOffsetTimezone())
# -> 2015-01-28 16:16:42.256841+05:30
print datetime.now(MyUTCOffsetTimezone())
# -> 2015-01-28 16:16:42.256915+05:30
Run Code Online (Sandbox Code Playgroud)
使用Python 3.2或更高版本,您可以使用内置日期时间库执行此操作:
import datetime
datetime.timezone(-datetime.timedelta(hours=5, minutes=30)
Run Code Online (Sandbox Code Playgroud)
要解决您的具体问题,您可以使用正则表达式:
sign, hours, minutes = re.match('([+\-]?)(\d{2})(\d{2})', '+0530').groups()
sign = -1 if sign == '-' else 1
hours, minutes = int(hours), int(minute)
tzinfo = datetime.timezone(sign * datetime.timedelta(hours=hours, minutes=minutes))
datetime.datetime(2013, 2, 3, 9, 45, tzinfo=tzinfo)
Run Code Online (Sandbox Code Playgroud)
如果你有pytz:
tz = pytz.FixedOffset(180)
now = timezone.now()
local_now = tz.normalize(now.astimezone(tz))
Run Code Online (Sandbox Code Playgroud)