我有UTC偏移时如何创建tzinfo?

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)

  • 此解决方案需要第三方库和区域名称,这两者都不需要。请参阅[海龟很可爱](/sf/answers/2596844911/)。 (2认同)

Ser*_*sta 16

Python标准库(8.1.6)说:

  • tzinfo是一个抽象基类
  • datetime模块不提供tzinfo的任何具体子类
  • 你需要派生一个具体的子类,并且(至少)提供你使用的日期时间方法所需的标准tzinfo方法的实现
  • tzinfo的具体子类可能需要实现以下方法......如果有疑问,只需实现所有这些方法
    • tzinfo.utcoffset(self,dt):返回本地时间与UTC的偏移量,以UTC为单位的分钟
    • tzinfo.dst(self,dt):返回夏令时(DST)调整,以UTC为单位的分钟,如果DST信息未知,则返回None
    • tzinfo.tzname(self,dt):返回与datetime对象dt对应的时区名称,作为字符串

这意味着您必须为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)


Dmi*_*ylo 8

你必须实现类的子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)


Tur*_*ute 8

使用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)

  • 天哪,这就是我一直在寻找的答案。比如为什么所有的帖子和文档都让它变得如此复杂。必须有某种方法来指定偏移量 (7认同)

kub*_*glu 7

如果你有pytz:

tz = pytz.FixedOffset(180)
now = timezone.now()
local_now = tz.normalize(now.astimezone(tz))
Run Code Online (Sandbox Code Playgroud)