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

20

我正在使用pytz将时区的epoch时间戳转换为日期。我的目标是创建一个DateTime对象,接受Olson数据库中的时区和epoch时间,并返回本地化的datetime对象。最终我需要回答类似于“在epoch时间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

输出结果显示的时间和实际时间相差3小时左右,有什么问题吗?我是Python的初学者,非常感谢您的帮助!


你在这里使用了错误的术语。纪元始终是1970年1月1日UTC午夜。你所拥有的是UNIX时间戳,它是相对于纪元的偏移量。请参阅https://en.wikipedia.org/wiki/Unix_epoch。 - Martijn Pieters
只是一个变量名,你可以称之为 epoch_time,对于问题来说没有任何影响。 - mobiusinversion
3个回答

39

datetime.fromtimestamp(self.epoch) 返回的是本地时间,不能与任意时区一起使用 localize()。你需要使用 utcfromtimestamp() 获取UTC时间并将其转换为所需的时区:

datetime.utcfromtimestamp(self.epoch).astimezone(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'))

或者一个更简单的选择是直接从时间戳构建:

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转换。


6

如果你想从Unix时间戳创建一个属于特定时区的 datetime 对象,你可以在创建 datetime 对象时将 pytz 对象作为 tz 参数传递。例如:

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

你可以使用pytz.all_timezones获取所有时区的列表,该函数返回可用的详尽时区名称列表
另外,也可以参考时区数据库时间区域列表维基百科。

-3
epochdt = datetime.datetime.fromtimestamp(epoch)
timezone1 = timezone("Timezone/String")
adjusted_datetime = timezone1.localize(epochdt)

从记忆中工作,所以请原谅任何语法错误,但这应该能让你走上正确的轨道。

编辑:错过了知道小时等部分。Python有很好的时间/日期格式化。在该链接的底部几乎是显示如何从datetime对象中提取不同属性的表格。


这与最初的方法非常相似,但是实现后仍然打印出相同的时间(在上面的__main__代码中)。基本上我现在所在的时间是早上8点。我试图弄清楚如何使上述代码分别打印出美国/洛杉矶和美国/纽约的8点和11点。 - mobiusinversion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接