2011-07-15 83 views
7

我从Python程序中的Web服务检索unix时间戳。此时间戳在美国时区。为了在法国本地化其他对象中将其插入MySQL数据库,我想将此时间戳转换为法国时区。将unix时间戳更改为不同的时区

我可以用数学函数做到这一点,但存在夏令时问题。我宁愿使用Python时间和日期特定的函数来处理这些概念。

您有提示,我迷失在Python文档中吗?

+0

零对应什么? 00:00:00 1970年1月1日PST或01:00:00 1970年1月1日PST? –

+0

好问题,我头撞墙3小时...事实上,它接缝,它不是PST,但PDT。我有一个额外的时间(这导致我-7h,而不是 - 8H),但在法国,我们在夏季UTC + 2H和冬季+ 1H。我无法用数学函数弄清楚它。我可能需要pytz – iwalktheline

+0

我的问题是不准确的,我错过了问题的根源。我打开另一个线程 – iwalktheline

回答

4

过去,当我们从服务提供商处下载的文件的时间戳具有与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 
+0

即使我的问题被错误地解释了(我没有找到确切的问题),你解决了它:) – iwalktheline

+0

如果你可以测试任意日期,作为一个终极测试,我会建议测试发生了什么2011年11月3日。欧洲将有冬令时,而美国仍有夏令时(见http://www.worldtimezone.com/daylight.html) –

5

如果它确实是一个unix时间戳,那么它是基于UTC的。只是为你的用例正确解释它。仅在必须以文本形式打印此日期时应用时区翻译。

如果您也将它作为时间戳存储在您身边,请保持原样。

+1

这不是一个“unix时间戳”,而是根据最初的太平洋时区1970年1月1日过去的秒数。这很丑陋,我知道,但它是Facebook API。我不能保留它,因为我有其他基于真正的“unix时间戳”的对象:UTC – iwalktheline

+1

如果你知道它是太平洋时间,而不是变化,你可以添加8小时使其成为UTC,并用作unix时间戳。 – viraptor

+0

事实上Facebook的api并没有考虑到法国的夏季是GMT + 2,春季是GMT + 1。所有数据均作为填充日期存储在数据库中,但在太平洋标准时区中。例如,我在facebook网站上创建一个事件2011-07-15 23:00。它存储为2011-07-15 23:00-0000(PST)。所有的问题都来自这里。 pytz解决了这个问题 – iwalktheline

1

pytz可能会帮助你在这里。就像viraptor说的,理想情况下,你会将所有的日期时间存储为unix UTC时间戳,并且只将本地化时打印出来。