【问题标题】:Python vs Javascript DateTimePython 与 Javascript 日期时间
【发布时间】: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

【问题讨论】:

    标签: javascript python timestamp utc gmt


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2010-10-22
    • 2010-10-02
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多