如何在Python中解析JSON日期时间字符串?

3

我正在使用Python调用远程API,该API以JSON格式返回数据。然后我使用json模块和json.loads()解析数据。我的问题出在日期上 - 我所调用的系统以以下格式返回日期:

/Date(1354011247940+0000)/

json.parse只会解析出一个字符串。我该如何将它转换为Python的日期时间对象呢?

编辑:不同于Convert JSON to Python object: how to handle DateTime conversion?,我无法控制所发送的数据格式,因此不能在序列化之前简单地更改格式。

3个回答

5
你应该使用正则表达式从这个日期中获取Unix时间戳,然后使用datetime模块将其转换为可读格式:
>m = re.search(r"Date\((\d+)\+", 'Date(1354011247940+0000)')
>print(datetime.datetime.fromtimestamp(int(m.group(1))/1000.0).strftime('%Y-%m-%d %H:%M:%S'))
2012-11-27 12:14:07

UPD: 请注意,这个日期中也包含毫秒,它们将被此代码截断。

如果我有一个格式为mm-yyyy的日期,想要将其转换为类似于xxxxxxxxx的日期对象,应该采取什么方法呢? - user2480542
为了读取负数(即1970年1月1日之前的日期),将正则表达式更改为re.search(r"Date(([+-]\d+)+", 'Date(1354011247940+0000)')。请注意,添加了[+-]以读取符号。 - Softec

1

我不能把这个添加到moonsly的回答评论中(没有声望),所以我把它做成了一个单独的回答。 只想补充一些其他人可能会发现有用的东西。 我遇到了同样的问题,但是json日期在我的数据中出现了一些不同的方式(即没有+号):

/Date(1416458650000)/

有9或13个字符的字符串。9个字符的字符串不需要除以1000.0。 我也没有使用正则表达式提取时间字符串。

MILLISECONDS = '/Date(1416458650000)/'.split('(')[1][:-2]
print datetime.datetime.fromtimestamp(int(MILLISECONDS)/1000.0).strftime('%Y-%m-%d %H:%M:%S')
2014-11-20 15:44:10

我也可以做到

SECONDS = '/Date(1416458650000)/'.split('(')[1][:-5]
print datetime.datetime.fromtimestamp(float(SECONDS)).strftime('%Y-%m-%d %H:%M:%S')
2014-11-20 15:44:10

1

是的,我看过了 - 但是被接受的(也是唯一的)答案说要在序列化时更改字符串的格式,这在这里不是一个选项。我无法控制数据或它如何序列化。 - ibrewster

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