将ASP.Net的JSON日期转换为Python datetime

3
我从rest接口获取到的响应是一个时间格式,例如:
ScheduleDate = "\/Date(1374811200000-0400)\/"
StartTime = "\/Date(-2208931200000-0500)\/"

我该如何将上述时间转换成类似于以下格式的格式?
"2012-01-01T10:30:00-05:00"

1
你有一个“ASP.Net JSON日期” - 这是由Microsoft开发的可怕格式,它不符合任何标准,他们自己已经放弃了这种格式,转而采用ISO。我发布的重复链接展示了如何在Python中解析它,但你应该回到REST服务的作者那里,并要求他们切换到ISO格式。他们可以使用JSON.Net来实现这一点 - 这也是Microsoft在MVC4中所做的。 - Matt Johnson-Pint
1个回答

3

我想这是我能想到的翻译,但你提供的两个示例输入都无法与你的示例输出匹配,因此我不确定这里是否存在时区偏移错误。

#!/usr/bin/env python

import datetime

def parse_date(datestring):
    timepart = datestring.split('(')[1].split(')')[0]
    milliseconds = int(timepart[:-5])
    hours = int(timepart[-5:]) / 100
    time = milliseconds / 1000

    dt = datetime.datetime.utcfromtimestamp(time + hours * 3600)
    return dt.strftime("%Y-%m-%dT%H:%M:%S") + '%02d:00' % hours

ScheduleDate = "\/Date(1374811200000-0400)\/"
StartTime = "\/Date(-2208931200000-0500)\/"

print(parse_date(ScheduleDate))
print(parse_date(StartTime))

看起来 Windows 不喜欢 datetime.(utc)?fromtimestamp() 中的负值。可能可以要求它从 Unix 纪元计算一个负时间差:

#!/usr/bin/env python

import datetime

EPOCH = datetime.datetime.utcfromtimestamp(0)

def parse_date(datestring):
    timepart = datestring.split('(')[1].split(')')[0]
    milliseconds = int(timepart[:-5])
    hours = int(timepart[-5:]) / 100
    adjustedseconds = milliseconds / 1000 + hours * 3600

    dt = EPOCH + datetime.timedelta(seconds=adjustedseconds)
    return dt.strftime("%Y-%m-%dT%H:%M:%S") + '%02d:00' % hours

ScheduleDate = "\/Date(1374811200000-0400)\/"
StartTime = "\/Date(-2208931200000-0500)\/"

print(parse_date(ScheduleDate))
print(parse_date(StartTime))

接近了,但不完全正确。第一部分是自1970年1月1日UTC以来的毫秒数。第二部分是输出的本地偏移量,但它没有反映在第一部分中。因此,对于提供的两个值,“ScheduleDate”应该等于“2013-07-26T00:00:00-04:00”,而“StartTime”应该等于“1900-01-01T11:00:00-05:00”。你明白我所说的可怕格式吗? - Matt Johnson-Pint
与ISO格式相比,ISO格式中呈现的值已经被调整,偏移量告诉您调整了多少。 - Matt Johnson-Pint
我已经将偏移量纳入计算中进行了调整。是的,那个格式真的很糟糕! - Kirk Strauser
负值对我不起作用。我得到了“ValueError:时间戳超出平台本地时间()/ gmtime()函数的范围”。 - Matt Johnson-Pint
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/34782/discussion-between-matt-johnson-and-kirk-strauser - Matt Johnson-Pint
显示剩余2条评论

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