为什么Python datetime和JS Date不匹配?

时间:2015-07-14 15:03:02

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

我有这段代码,它返回给定日期的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

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

在JS中执行此操作
new Date(2000, 5, 1).getTimezoneOffset(); // -180

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

2 个答案:

答案 0 :(得分:2)

在我的系统上,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 definitionutc 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"

答案 1 :(得分:0)

如果您打印以下结果 -

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

你会注意到它提供了一个datetime.timedelta()对象,它既有天也有秒。

因此,对于UTC - <something>的时区,这实际上将天数设为-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();时,我认为它会给你今天的UTC时区偏移,而不是日期2000/05/01(因为对于日期 - 2000/05/01正确的偏移是你从python获得的 - 240)。您可以结帐TimezoneJS以获取特定时区以及特定日期的偏移等。