我想把一个Javascript API调用转换成Python代码。这个可行的Javascript代码可以正常工作,并生成类似于以下这样的时间戳:
var curdate = new Date();
var gmtstring = curdate.toGMTString();
var utc = Date.parse(gmtstring) / 1000;
这个结果(自纪元以来的秒数)随后被哈希并用于API调用,但这是相关部分。如果有人能告诉我正确的转换方式,将不胜感激。
以下是有关不同方法得到的不同结果的详细信息:
Javascript(有效的API结果)
var curdate = new Date(2013, 7, 10);
var gmtstring = curdate.toGMTString();
var utc = Date.parse(gmtstring) / 1000;
结果:1376089200
Python(API结果无效)
from datetime import datetime
import calendar
d = datetime(2013, 8, 10)
calendar.timegm(d.utctimetuple())
结果:1376092800
我显然缺少一些东西,有人能给我解释一下吗?
更新
我最初在我的例子中犯了一个错误,因为Javascript使用基于0的日期,Python的日期是基于1的。
Jonathon友善地解释说,这些值的差异是由于Python默认为UTC,而Javascript默认为本地时区。在我的情况下,这是GMT,这是API所需的。现在我只需要在Python中获得这个结果。
答案
解决方案是提供的时区不匹配。虽然我仍然遇到第三方api的问题,但我至少现在获得了正确的时间。
这可能需要清理:
from datetime import datetime
import calendar
import time
import pytz
def GenerateTimeStamp(d):
europe = pytz.timezone('Europe/London')
d = europe.localize(d)
tuple = d.utctimetuple()
timestamp = int(time.mktime(tuple))
return timestamp
只需提供日期时间:
GenerateTimeStamp(datetime(2013, 8, 10))
或者
GenerateTimeStamp(datetime.utcnow())
作为旁注,如果您正在尝试此操作并希望使用pip安装pytz1,您可以使用pre tag2获取它:
pip install --pre pytz
datetime
,你可以传递一个自定义的tzinfo
子类实例:datetime(2013, 8, 10, tzinfo=desiredTZ)
。你也可以使用pytz
:pytz.timezone('...').localize(datetime(2013, 8, 10))
。 - Jonathan Lonowski