为什么Python datetime 和JS Date 不匹配?
Why Python datetime and JS Date does not match?
我有这段代码,returns 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 结果)?
如果打印以下结果 -
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)
要获取有关实际偏移量的信息,您需要同时使用 days
和 seconds
,使用类似的代码(对于上述时区 - 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
以获取特定时区以及特定日期的偏移量等。
在我的系统上,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()
returns-240
(符号不同,值相同)。
Python 使用:local time = utc time + utc offset
定义。 while 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"
我有这段代码,returns 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 结果)?
如果打印以下结果 -
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)
要获取有关实际偏移量的信息,您需要同时使用 days
和 seconds
,使用类似的代码(对于上述时区 - 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
以获取特定时区以及特定日期的偏移量等。
在我的系统上,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()
returns-240
(符号不同,值相同)。
Python 使用:local time = utc time + utc offset
定义。 while 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"