JavaScript日期对象转换为Python datetime

17

我正在使用dhtmlxscheduler,并将日期发送到django服务器进行处理。

dhtmlxscheduler提供了以下日期对象,其提供的方法从下面的第二行开始:

end_date: Sat Nov 19 2011 01:00:00 GMT-0500 (EST)
__proto__: Invalid Date
constructor: function Date() { [native code] }
getDate: function getDate() { [native code] }
getDay: function getDay() { [native code] }
getFullYear: function getFullYear() { [native code] }
getHours: function getHours() { [native code] }
getMilliseconds: function getMilliseconds() { [native code] }
getMinutes: function getMinutes() { [native code] }
getMonth: function getMonth() { [native code] }
getSeconds: function getSeconds() { [native code] }
getTime: function getTime() { [native code] }
getTimezoneOffset: function getTimezoneOffset() { [native code] }
getUTCDate: function getUTCDate() { [native code] }
getUTCDay: function getUTCDay() { [native code] }
getUTCFullYear: function getUTCFullYear() { [native code] }
getUTCHours: function getUTCHours() { [native code] }
getUTCMilliseconds: function getUTCMilliseconds() { [native code] }
getUTCMinutes: function getUTCMinutes() { [native code] }
getUTCMonth: function getUTCMonth() { [native code] }
getUTCSeconds: function getUTCSeconds() { [native code] }
getYear: function getYear() { [native code] }
setDate: function setDate() { [native code] }
setFullYear: function setFullYear() { [native code] }
setHours: function setHours() { [native code] }
setMilliseconds: function setMilliseconds() { [native code] }
setMinutes: function setMinutes() { [native code] }
setMonth: function setMonth() { [native code] }
setSeconds: function setSeconds() { [native code] }
setTime: function setTime() { [native code] }
setUTCDate: function setUTCDate() { [native code] }
setUTCFullYear: function setUTCFullYear() { [native code] }
setUTCHours: function setUTCHours() { [native code] }
setUTCMilliseconds: function setUTCMilliseconds() { [native code] }
setUTCMinutes: function setUTCMinutes() { [native code] }
setUTCMonth: function setUTCMonth() { [native code] }
setUTCSeconds: function setUTCSeconds() { [native code] }
setYear: function setYear() { [native code] }
toDateString: function toDateString() { [native code] }
toGMTString: function toGMTString() { [native code] }
toISOString: function toISOString() { [native code] }
toJSON: function toJSON() { [native code] }
toLocaleDateString: function toLocaleDateString() { [native code] }
toLocaleString: function toLocaleString() { [native code] }
toLocaleTimeString: function toLocaleTimeString() { [native code] }
toString: function toString() { [native code] }
toTimeString: function toTimeString() { [native code] }
toUTCString: function toUTCString() { [native code] }
valueOf: function valueOf() { [native code] }
__proto__: Object
什么是最简单的方法来选择其中一个toString方法,然后在Python服务器端使用datetime.strptime()解析它以创建Python datetime对象?
简单的toString方法返回我一个格式为datetime的字符串:
Sat Nov 19 2011 00:00:00 GMT-0500 (EST)

尝试使用不同的格式指令均未成功。

例如:

datetime.strptime("Sat Nov 19 2011 00:00:00 GMT-0500 (EST)", "%a %b %d %Y %H:%M:%S %Z") 
---> unconverted data remains: -0500 (EST)

并且:

datetime.strptime("Sat Nov 19 2011 00:00:00 GMT-0500 (EST)", "%a %b %d %Y %H:%M:%S %z") 
---> ValueError: 'z' is a bad directive in format '%a %b %d %Y %H:%M:%S %z'
3个回答

25

toUTCString() 的返回值为:

"Tue, 22 Nov 2011 06:00:00 GMT"

这可以通过以下方式解析:

datetime.strptime("Tue, 22 Nov 2011 06:00:00 GMT", "%a, %d %b %Y %H:%M:%S %Z")

1
如果您希望从输入中获取来自“GMT”的意识日期时间,类似于 datetime.strptime("Tue, 22 Nov 2011 06:00:00 GMT".replace("GMT", "+00:00"), "%a, %d %b %Y %H:%M:%S %z") 就可以解决问题。 - FObersteiner

15

看起来你得到的是一个普通的JavaScript日期对象。在这种情况下,最简单的方法可能是使用getTime方法获取时间戳。它应该返回类似于1321463229215的东西,这只是毫秒级别的时间戳。

datetimefromtimestamp期望的是以秒为单位的时间戳,所以只需要将该时间戳除以1000.0即可。

from datetime import datetime
datetime.fromtimestamp(1321463229215 / 1000.0)

2
不幸的是,该方法返回秒后的毫秒单位。即:小时:分钟:秒:毫秒。 - TheOne
2
在NT3RP的帖子中添加了一个编辑,将getUTCMilliseconds更改为getTime,并将时间戳除以1000.0,因为fromtimestamp期望以秒为单位而不是毫秒为单位的时间戳。 - Andrew
非常感谢@NT3RP! - Pyzard

9

尝试使用python-dateutilpip install python-dateutil)。

import dateutil.parser as dt
date_time_obj = dt.parse("Tue, 22 Nov 2011 06:00:00 GMT")

date_time_obj 将会是一个日期时间对象。


这肯定是最简单的选择,但我认为它比其他选项慢得多。 - Nicholas Obert
1
在我的实验中,这种方法大约需要130微秒,而使用datetime解析则需要大约15微秒,因此慢了近10倍。但是,我认为在典型的Python应用程序中,这不太可能成为一个问题。@NicholasObert - miksus
是的,这可能不会有太大的影响,但对于选择这种解决方案的人来说仍然值得指出。 - Nicholas Obert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接