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;

结果:1​​376089200

Python(无效的 API 结果)

from datetime import datetime
import calendar

d = datetime(2013, 8, 10)
calendar.timegm(d.utctimetuple())

结果:1​​376092800

我显然遗漏了一些东西,有人可以告诉我吗?

更新

我最初在示例中犯了一个错误,因为 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 在不同的时区创建 datetimes,您可以传递 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 日期时间的主要内容,如果未能解决你的问题,请参考以下文章

Python绘图强制按字母顺序而不是按时间顺序排序日期

JavaScript 中两个日期的年、月、日之间的差异

python日期与时间

JavaScript Date.parse()详解

Python时间戳与日期的相互转化

Python3 日期与时间戳互相转换(函数可调用)