将Unix时间戳转换为不同的时区

8

我在Python程序中从Web服务中检索到一个Unix时间戳。该时间戳位于美国时区。为了将其与其他物体一起插入到位于法国的MySQL数据库中,我想将此时间戳转换为法国时区。

我可以使用数学函数来完成此操作,但是存在夏令时的问题。我更愿意使用Python中处理这些概念的时间和日期具体函数。

您有什么提示吗?我在Python文档中迷失了方向。


零对应于哪个时间?是1970年1月1日PST的00:00:00还是01:00:00? - Andre Holzner
好问题,我已经撞了3个小时的墙...实际上看起来不是PST而是PDT。我有一个额外的小时(导致我是-7h而不是-8H),但在法国,夏季我们是UTC+2H,冬季是+1H。我无法用数学函数算出来。我可能需要pytz。 - kheraud
我的问题不准确,我错过了问题的根源。我会开另一个线程。 - kheraud
3个回答

8

如果这确实是一个Unix时间戳,那么它是基于UTC的。只需根据您的用例正确解释它即可。仅在必须将此日期打印为文本时应用时区转换。

如果您也将其存储为时间戳,则保持不变。


1
这不是一个“UNIX时间戳”,而是基于西太平洋时区自1970年1月1日以来经过的秒数。我知道它很丑,但这是Facebook API。我不能保留它,因为我有其他基于真实的“UNIX时间戳”:UTC的对象。 - kheraud
1
如果您知道它是太平洋时间并且不会改变,您可以添加8小时以使其成为UTC并用作Unix时间戳。 - viraptor
事实上,Facebook API没有考虑到法国在夏季是GMT+2,在春季是GMT+1。所有的数据都存储在数据库中,填写日期时使用的是太平洋标准时间。例如,我在Facebook网站上创建了一个事件2011-07-15 23:00。它被存储为2011-07-15 23:00-0000(PST)。所有问题都源于此。pytz解决了这个问题。 - kheraud

6

过去我遇到过类似的问题,当我们从服务提供商下载的文件时间戳与PST时区相对应时。以下内容可以帮助我进行转换:

import pytz, datetime, time
import os

originalTimeStamp = os.stat("/tmp/file-from-us-west-coast").st_mtime

# prints e.g. 2010-03-31 13:01:18
print "original:",datetime.datetime.fromtimestamp(originalTimeStamp)

# re-interpret 
originalTimeZone = "America/Los_Angeles"
targetTimeZone   = "Europe/Paris"

newTimeStamp = pytz.timezone(originalTimeZone).localize(datetime.datetime.fromtimestamp(originalTimeStamp)).astimezone(pytz.timezone(targetTimeZone))

# prints e.g. 2010-03-31 22:01:18+02:00
print "new:     ",newTimeStamp

# convert back to seconds since epoch
newTimeStamp = time.mktime(newTimeStamp.timetuple())

# print time difference in hours
print (newTimeStamp - originalTimeStamp) / 3600.0

即使我的问题表述不清(我还没有找到确切的问题),你还是解决了它 :) - kheraud
如果您可以测试任意日期,作为最终测试,我建议测试一下2011年11月3日发生的情况。欧洲将进入冬令时,而美国仍处于夏令时(请参见例如http://www.worldtimezone.com/daylight.html)。 - Andre Holzner

1

pytz 可能会对你有所帮助。就像 viraptor 所说的那样,理想情况下,您应将所有日期时间存储为 Unix UTC 时间戳,并仅在打印时将时间本地化。


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