来自Windows机器的date对象——时区问题

Python - date object from Windows machine -- time zone issues

本文关键字:时区 问题 对象 date Windows 机器 来自      更新时间:2023-09-26

我有一个jQuery应用程序,它发送一个日期对象到python进行解析。问题是,当我尝试在Windows机器上使用jQuery时,日期对象看起来像这样:

Tue Mar 12 2013 00:00:00 GMT-0600(Mountain Daylight Time)

而在我的Mac上,我得到:

Tue Mar 12 2013 00:00:00 GMT-0600(PST)

当我尝试用strptime函数在Python中解析这些时,它失败了,因为它不理解第一个(MDT)末尾的时区。它抱怨这是一个"未知的字符串格式"。

如何解决这个问题?我做错了什么吗?

这里的最好的解决方案可能是让您的jQuery代码在发送日期时间之前将其转换为GMT。(如果还需要时区信息,请单独发送。)然后你可以把它们从JSON(或其他)中取出来,用strptime把它们转换成GMT datetime对象,然后使用它们,你就完成了。

但是最简单的解决方案,也就是最少的代码更改,就是让jQuery做错误的事情,并在Python端抛弃时区。基本上,不是这样:

dt = datetime.datetime.strptime(jsondate)

这样做:

dt = datetime.datetime.strptime(jsondate.partition('(')[0])

注意,扔掉'('之后的所有内容仍然会留下-0600部分;你只是失去了"PST"或"山地夏令时"的部分。

而且那些部分对你没有任何好处。datetime无法理解这些时区名称。而且,即使它做了,它也没有任何东西可以映射到它们,除了偏移量(你已经有了)。如果你想要真正的时区,你需要一些第三方库,比如pytz。**

最重要的是,strptime特别返回朴素datetime对象,而不是感知对象。因此,即使datetime可以解析和查找时区,它仍然不会对它们做任何有用的事情,除非您解析datetime,然后取出时区并单独解析它并查找它,然后在datetime上调用astimezon

所以,总的来说,丢掉这些信息最坏的情况就是你已经有了这些信息。

边注,在连续三个项目,我将一个datetime序列化器推入我的JSON en/Python端的译码器(和一个匹配的序列化器在JS方面,有一个JS)特别所以我可以通过UTC日期时间(以ISO8601格式,因为这是作为计算机作为seconds-since-epoch易于使用,对人类和更容易读/编辑)和今天的时区偏移,但开关tzinfo关键以后如果因为重要。这三次,它都没有变得重要……而在它很重要的项目中,我通常会传递ICAL时间表或前格里高利历日期或其他类似的有趣的东西。

最后,作为一个在我的职业生涯中写了太多与日期相关的代码的人,我不得不说:如果你知道任何邪恶的霸主计划接管世界,如果他们承诺废除时区,我愿意忽略他们奴役人类或让小猫打婴儿的其他程序,并报名成为一个追随者。

*…至少对我来说是最简单的,因为我比JS和jQuery更了解Python。:)

** IIRC, pytz不能处理nt风格的时区键,如"山地夏令时",所以你实际上需要另一个库来处理它。