在 Python 中使用 pytz 本地化纪元时间
Posted
技术标签:
【中文标题】在 Python 中使用 pytz 本地化纪元时间【英文标题】:Localizing Epoch Time with pytz in Python 【发布时间】:2012-10-10 07:30:02 【问题描述】:我正在使用 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
这会打印相同的小时,而应该提前 3 小时左右。这里出了什么问题?我是一个 Python 初学者,感谢任何帮助!
【问题讨论】:
您在这里使用了错误的术语。纪元总是 1970 年 1 月 1 日,UTC 午夜。你所拥有的是一个 UNIX 时间戳,它是与纪元的偏移量。见en.wikipedia.org/wiki/Unix_epoch 只是一个变量名,你可以叫它epoch_time
对问题没有影响
【参考方案1】:
datetime.fromtimestamp(self.epoch)
返回不应与任意 timezone.localize() 一起使用的本地时间;您需要 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'))
或者更简单的替代方法是直接从时间戳构造:
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 转换。
【讨论】:
【参考方案2】:要从 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
获取所有时区的列表,会返回可使用的时区名称的详尽列表。
还可以查看List of tz database time zones wiki。
【讨论】:
【参考方案3】:epochdt = datetime.datetime.fromtimestamp(epoch)
timezone1 = timezone("Timezone/String")
adjusted_datetime = timezone1.localize(epochdt)
凭记忆工作,所以请原谅任何语法错误,但这应该会让你走上正轨。
编辑:错过了关于知道时间等的部分。 Python 有很棒的Time/Date Formatting。该链接的底部几乎是显示如何从 datetime 对象中提取不同属性的表格。
【讨论】:
这与最初的方法非常相似,但实现它仍然会打印相同的时间(在上面的 main 代码中)。基本上是早上 8 点,我现在在哪里。我想弄清楚的是如何让上面的代码分别为 America/Los_Angeles 和 America/New_York 打印 8 和 11m。以上是关于在 Python 中使用 pytz 本地化纪元时间的主要内容,如果未能解决你的问题,请参考以下文章
为啥 tzinfo 会在 python 中打破创建纪元时间?
python / pytz问题从本地时区转换为UTC然后返回
Python pytz:将本地时间转换为 UTC。本地化似乎没有转换