1

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

我该如何解决这个问题?难道我做错了什么?

4

1 回答 1

2

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

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

dt = datetime.datetime.strptime(jsondate)

做这个:

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

请注意,在静止之后扔掉所有东西'('会给你留下-0600部分;你只是失去了“PST”或“山地日光时间”部分。

无论如何,这些部分对你没有任何好处。datetime不理解这些时区名称。而且,即使它这样做了,除了偏移量(你已经拥有)之外,它没有任何东西可以映射它们。如果您想要实时时区,则需要一些第三方库,例如pytz.**

最重要的是,strptime专门返回天真datetime的对象,而不是有意识的对象。因此,即使datetime可以解析和查找时区,它仍然不会对它们做任何有用的事情,除非您解析datetime,然后拉出时区并单独解析并查找它,然后调用astimezon.datetime

因此,总而言之,丢弃这些信息的最坏情况正是您已经拥有的。

附带说明一下,在连续三个项目中,我将日期时间序列化器推入 Python 端的 JSON 编码/解码器(以及 JS 端的匹配序列化器,用于具有 JS 端的序列化器),这样我就可以传递一个 UTC 日期时间(采用 ISO8601 格式,因为这对于计算机来说就像一个自纪元以来的秒数一样易于使用,并且对于人类来说更容易阅读/编辑)和一个时区偏移量,但如果它切换到一个 tzinfo 键因为以后很重要。所有这三次,它从未变得重要......而它一直很重要的项目,我通常会传递 ICAL 时间表或公历前的日期或其他类似的有趣的东西。

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

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

** IIRC,pytz也无法处理 NT 风格的时区键,例如“Mountain Daylight Time”,因此您实际上需要另一个库来处理它。我想我是从一个处理各种 MS 日期时间的库中得到的,包括处理微软三个类似的 1601-ish 纪元时间之间的差异(两个不太相同的纪元,不同的特殊“时间结束规则”) " 和 "开始时间" 和 "不是日期" 值,...)。

于 2013-03-22T23:56:58.647 回答