使用pytz在Python中本地化Epoch时间

mob*_*ion 15 python timezone datetime epoch pytz

我正在努力将epoch时间戳转换为不同时区的日期与pytz.我想要做的是创建一个DateTime对象,它接受一个Olson数据库时区和一个纪元时间,并返回一个本地化的datetime对象.最后,我需要回答诸如"在纽约时间1350663248的几小时?"之类的问题.

这里有些东西不正常:

import datetime, pytz, time

class DateTime:
    def __init__(self, timezone, epoch):
        self.timezone = timezone
        self.epoch = epoch
        timezoneobject = pytz.timezone(timezone)
        datetimeobject = datetime.datetime.fromtimestamp( self.epoch )
        self.datetime = timezoneobject.localize(datetimeobject)

    def hour(self):
        return self.datetime.hour

if __name__=='__main__':
    epoch = time.time()
    dt = DateTime('America/Los_Angeles',epoch)
    print dt.datetime.hour
    dt = DateTime('America/New_York',epoch)
    print dt.datetime.hour
Run Code Online (Sandbox Code Playgroud)

这打印相同的小时,而一个应该提前3个小时.这里出了什么问题?我是一个完整的Python初学者,任何帮助表示赞赏!

jfs*_*jfs 26

datetime.fromtimestamp(self.epoch)返回不应与任意timezone.localize()一起使用的localtime; 您需要utcfromtimestamp()以UTC格式获取日期时间,然后将其转换为所需的时区:

from datetime import datetime
import pytz

# get time in UTC
utc_dt = datetime.utcfromtimestamp(posix_timestamp).replace(tzinfo=pytz.utc)

# convert it to tz
tz = pytz.timezone('America/New_York')
dt = utc_dt.astimezone(tz)

# print it
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
Run Code Online (Sandbox Code Playgroud)

或者更简单的替代方法是直接从时间戳构造:

from datetime import datetime
import pytz

# get time in tz
tz = pytz.timezone('America/New_York')
dt = datetime.fromtimestamp(posix_timestamp, tz)
# print it
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它会隐式转换为UTC.


Moi*_*dri 5

为了创造datetime属于来自于Unix时间戳特定的时区对象,你可以通过pytz对象为tz在创建您的参数datetime。例如:

>>> from datetime import datetime
>>> import pytz

>>> datetime.fromtimestamp(1350663248, tz= pytz.timezone('America/New_York'))
datetime.datetime(2012, 10, 19, 12, 14, 8, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)
Run Code Online (Sandbox Code Playgroud)

您可以获得所有时区的列表,使用pytz.all_timezones返回可以使用的时区名称的详尽列表

另请查看tz 数据库时区wiki列表


小智 -3

epochdt = datetime.datetime.fromtimestamp(epoch)
timezone1 = timezone("Timezone/String")
adjusted_datetime = timezone1.localize(epochdt)
Run Code Online (Sandbox Code Playgroud)

凭记忆工作,因此请原谅任何语法错误,但这应该会让您走上正轨。

编辑:错过了有关了解时间等的部分。Python 有很棒的时间/日期格式。该链接的底部几乎是一个表格,显示如何从日期时间对象中提取不同的属性。