Python - 来自Windows机器的日期对象 - 时区问题

时间:2013-03-22 23:26:46

标签: javascript python date strptime

我有一个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)末尾的时区。它抱怨说这是一种“未知的字符串格式”。

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

1 个答案:

答案 0 :(得分:2)

这里的最佳解决方案可能是让您的jQuery代码在发送之前将其日期时间转换为GMT。 (如果你也想要时区,请单独发送。)然后你可以从Python端的JSON(或其他)中取出它们,将它们变成带有datetime的GMT strptime对象,并且使用它们,你就完成了。

最简单的解决方案*,代码更改最少,就是让jQuery做错了,扔掉了Python端的时区。基本上,而不是:

dt = datetime.datetime.strptime(jsondate)

这样做:

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

请注意,在'('之后丢弃所有内容仍然会留下-0600部分;你只是失去了“PST”或“Mountain Daylight Time”部分。

无论如何,这些部分对你没有任何好处。 datetime不了解这些时区名称。并且,即使它确实如此,除了偏移(你已经拥有)之外,它没有任何地方可以映射它们。如果你想要真正的时区,你需要一些第三方库,如pytz。**

最重要的是,strptime专门返回天真的datetime个对象,而不知道它们。因此,即使datetime可以解析并查找时区,它仍然不会对它们执行任何有用的操作,除非您解析datetime,然后拉出时区并单独解析并查看它向上,然后在astimezon上调用datetime

因此,总而言之,抛弃这些信息的最坏情况就是你已经拥有的。

作为旁注,在连续的三个项目中,我将日期时间序列化程序推送到Python端的JSON en / decoder(以及JS端的匹配序列化程序,具有JS端的那个)所以我可以传递一个UTC日期时间(ISO8601格式,因为它对于计算机来说很容易使用,因为它是一个秒 - 自 - 纪元,并且更容易阅读/编辑人类)和今天的时区偏移,但切换到tzinfo关键,如果它因为重要以后。所有这三次,它从未变得重要......而且 的项目非常重要,我通常会在ICAL时间表或前Gregorian日期或其他同样有趣的东西周围传递。

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

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

** IIRC,pytz也无法处理像“日光时间”这样的NT风格的时区键,所以你实际上还需要另一个库来处理它。我认为我从一个库中完成了各种MS日期时间的工作,包括处理微软三个相似的1601-ish时代之间的差异(两个不太相同的时代,特殊的不同规则“结束时间“和”时间的开始“和”不是日期“的值,......)。