在 Python 中使用 pytz 本地化纪元时间

2022-01-16 00:00:00 python datetime timezone pytz epoch

问题描述

我正在使用 pytz 将纪元时间戳转换为不同时区的日期.我想要做的是创建一个 DateTime 对象,它接受一个 Olson 数据库时区和一个纪元时间并返回一个本地化的 datetime 对象.最终,我需要回答诸如纪元时间 1350663248 时在纽约几点钟?"

Im working on converting epoch timestamps to dates in different timezones with pytz. What I am trying to do is create a DateTime object that accepts an Olson database timezone and an epoch time and returns a localized datetime object. Eventually I need to answer questions like "What hour was it in New York at epoch time 1350663248?"

这里有些东西不能正常工作:

Something is not working correctly here:

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

这会打印相同的小时,而应该提前 3 小时左右.这里出了什么问题?我是一个 Python 初学者,感谢任何帮助!

This prints the same hour, whereas one should be 3 or so hours ahead. Whats going wrong here? I'm a total Python beginner, any help is appreciated!


解决方案

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

datetime.fromtimestamp(self.epoch) returns localtime that shouldn't be used with an arbitrary timezone.localize(); you need utcfromtimestamp() to get datetime in UTC and then convert it to a desired timezone:

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

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

Or a simpler alternative is to construct from the timestamp directly:

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

在这种情况下,它隐式地从 UTC 转换.

It converts from UTC implicitly in this case.

相关文章