【问题标题】:Why Python datetime and JS Date does not match?为什么 Python datetime 和 JS Date 不匹配?
【发布时间】:2015-10-03 07:25:11
【问题描述】:

我有这段代码,它返回给定日期的 UTC 偏移量:

>>> import datetime
>>> import pytz
>>> cet = pytz.timezone("Europe/Moscow")
>>> cet.localize(datetime.datetime(2000, 6, 1))
datetime.datetime(2000, 6, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Moscow' MSD+4:00:00 DST>)
>>> int(cet.localize(datetime.datetime(2000, 6, 1)).utcoffset().seconds/60)
240

好的,在 JS 中使用此代码 (http://jsfiddle.net/nvn1fef0/)

new Date(2000, 5, 1).getTimezoneOffset(); // -180

也许我做错了什么?以及如何在偏移之前获得plus-minus(如在 JS 结果中)?

【问题讨论】:

    标签: javascript python python-3.x pytz python-dateutil


    【解决方案1】:

    在我的系统上,Python 和 Javascript 产生相同的结果(模符号):

    >>> from datetime import datetime, timedelta
    >>> import pytz
    >>> tz = pytz.timezone('Europe/Moscow')
    >>> dt = tz.localize(datetime(2000, 6, 1), is_dst=None)
    >>> print(dt)
    2000-06-01 00:00:00+04:00
    >>> dt.utcoffset() // timedelta(minutes=1)
    240
    

    new Date(2000, 6, 1).getTimezoneOffset() 返回-240(不同的符号,相同的值)。

    Python 使用:local time = utc time + utc offset 定义。而Javascript uses a different definition:utc offset = utc time - local time 即,两个结果都是正确的,并且对于相应的定义具有正确的符号。

    对于可移植的 Javascript 解决方案,您可以使用 momentjs library,它提供对与 pytz Python 模块相同的 tz 数据库的访问:

    > var moscow = moment.tz("2000-06-01", "Europe/Moscow");
    undefined
    > moscow.format()
    "2000-06-01T00:00:00+04:00"
    

    【讨论】:

      【解决方案2】:

      如果您打印以下结果 -

      print(cet.localize(datetime.datetime(2000, 6, 1)).utcoffset())
      

      你会注意到它给出了一个 datetime.timedelta() 对象,它既有天又有秒。

      因此,对于 UTC - &lt;something&gt; 的时区,这实际上给出了 -1 的天数,然后以秒为单位的剩余天数。示例 -

      In [84]: cet = pytz.timezone("America/Los_Angeles")
      
      In [87]: cet.localize(datetime.datetime(2000, 6, 1)).utcoffset()
      Out[87]: datetime.timedelta(-1, 61200)
      

      要获取有关实际偏移量的信息,您需要同时使用 daysseconds ,使用类似(对于上述时区 - America/Los_Angeles)之类的代码 -

      In [88]: int((cet.localize(datetime.datetime(2000, 6, 1)).utcoffset().days*60*60*24 + cet.localize(datetime.datetime(2000, 6, 1)).utcoffset().seconds)/60)
      Out[88]: -420
      

      另外,我相信当你在 javascript 中做 - new Date(2000, 5, 1).getTimezoneOffset(); 时,我认为它会给你今天日期的时区偏移量,而不是日期 2000/05/01 (因为日期 - 2000/05/01正确的偏移量是您从 python 获得的 - 240) 。您可以查看 TimezoneJS 以获取特定时区以及特定日期偏移等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-30
        • 2012-12-14
        • 2017-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多