我正致力于使用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初学者,感谢任何帮助!
答案 0 :(得分: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'))
或者更简单的替代方法是直接从时间戳构造:
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。
答案 1 :(得分:2)
要从unix时间戳创建属于特定时区的datetime
对象,您可以在创建tz
时将pytz
对象作为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>)
您可以使用 pytz.all_timezones
获取所有时区的列表,其中会返回可以使用的时区名称的详尽列表。
另请查看List of tz database time zones wiki。
答案 2 :(得分:-3)
epochdt = datetime.datetime.fromtimestamp(epoch)
timezone1 = timezone("Timezone/String")
adjusted_datetime = timezone1.localize(epochdt)
在内存中工作,请原谅任何语法错误,但这应该让你走上正轨。
编辑:错过了解小时等部分。 Python非常棒Time/Date Formatting。几乎该链接的底部是显示如何从datetime对象中提取不同属性的表。