Python 与 Javascript 日期时间
Posted
技术标签:
【中文标题】Python 与 Javascript 日期时间【英文标题】:Python vs Javascript DateTime 【发布时间】:2013-08-12 05:18:53 【问题描述】:我正在尝试将 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
【问题讨论】:
【参考方案1】:对于 JavaScript 日期,month
argument is 0 - 11。因此,对于 8 月,您需要通过 7
。
表示月份的整数值,从一月的 0 开始到十二月的 11。
它们也有不同的默认时区,Python 默认为 UTC,而 JavaScript 默认为用户的“local”时区。
您可以使用 Date.UTC()
,它返回时间戳,用于 JavaScript 中的等效项。
var utc = Date.UTC(2013, 7, 10) / 1000;
// 1376092800
旁注:您可以使用getTime()
获取Date
的时间戳。
var curdate = new Date(2013, 7, 10);
var utc = curdate.getTime() / 1000;
【讨论】:
哎呀,我的错误,更正了示例日期。看看你的 UTC 建议。 啊,这说明了示例中的差异,javascript是我需要的结果。我的时区是格林威治标准时间,这解释了这一点。您能否建议如何在 python 中获取 GMT 结果? @PaulCoghill 好吧,你现在有来自 Python 的 UTC/GMT 日期的时区;这实际上似乎是问题所在。如果您希望 Python 在不同的时区创建datetime
s,您可以传递 custom tzinfo
subclass 的实例:datetime(2013, 8, 10, tzinfo=desiredTZ)
。你也可以use pytz
:pytz.timezone('...').localize(datetime(2013, 8, 10))
。【参考方案2】:
new Date(2013, 8, 10)
在 javascript 中表示 2013 年 9 月/10 日。
datetime(2013, 8, 10)
在 Python 中表示 2013 年 8 月/10 日。
您正在比较两个不同的日期。
当地时间与 UTC
结果可能不同(我的系统时区:亚洲/首尔)。
javascript
> new Date(2013, 7, 10) / 1000
1376060400
> Date.UTC(2013, 7, 10) / 1000
1376092800
Python
>>> import calendar
>>> import datetime
>>> import time
>>> time.mktime(datetime.datetime(2013, 8, 10).timetuple())
1376060400.0
>>> calendar.timegm(datetime.datetime(2013, 8, 10).timetuple())
1376092800
见Python - calendar.timegm() vs. time.mktime()
【讨论】:
谢谢,我会阅读您推荐的文章。感谢您的更新,尽管根据问题中的示例,我需要调用的 API 预计该日期为 1376089200。 @PaulCoghill,你的时区是什么? 格林威治标准时间。虽然目前是 BST(英国夏令时),但 javascript 都可以使用。 @PaulCoghill,您是否在系统中尝试过time.mktime(datetime.datetime(2013, 8, 10).timetuple())
?
time.mktime(datetime.datetime(2013, 8, 10).timetuple()) 返回 1376092800.0【参考方案3】:
除了上面乔纳森的回答,我可能会在python方面推荐这个:
d = datetime(2013, 8, 10)
d.strftime("%s")
这将返回:'1376107200'
【讨论】:
对我来说,这会返回:本地 1376089200 远程服务器上的 1376092800以上是关于Python 与 Javascript 日期时间的主要内容,如果未能解决你的问题,请参考以下文章