日期转换.NET JSON到I

2024-05-15 07:53:00 发布

您现在位置:Python中文网/ 问答频道 /正文

如何从转换日期时间格式JSON.Net例如:

/日期(1154970000000+0700)/

到ISO-??格式 2011-12-18T23:34:59Z

最好使用Python或Javascript。在

我决定选择后者,因为它在JS世界中似乎是使用最广泛、可读性最强、自然可排序的。我将根据每个用户存储偏移量。在

如果一个实现又有点太问了,如果有人能告诉我这两种格式的正确名称,我可能会更幸运地理解如何转换。在


Tags: 用户名称jsonnet排序格式时间js
3条回答
jsonDate = "/Date(1154970000000+0700)/";

var strDate = parseInt(jsonDate.replace(/\/Date\(([-\d]+).*$/, "$1"));
var strHour = parseInt(jsonDate.replace(/.*\d([+-]\d\d).*$/, "$1"), 10);
var strMin = parseInt(jsonDate.replace(/.*\d([+-])\d\d(\d\d).*$/, "$1$2"), 10);

var date = new Date(strDate);
if (!isNaN(strHour)) date.setHours(date.getHours() + strHour);
if (!isNaN(strMin)) date.setMinutes(date.getMinutes() + strMin);

var out = date.toISOString();

以及转换为ISO的函数:

^{pr2}$

[替代答案]

这是python2.x版本。对于python3.x,只需要更改测试部分中的print语句

据我通过谷歌搜索可以确定:主要成分是自1970年1月1日以来的毫秒数。可能是阴性。正数不需要+符号。后面可以跟UTC的可选偏移量,它由5个字符组成:一个强制符号(+-),2个数字表示小时,2个数字表示分钟。以上所有内容前加“/Date”(“后接“)/”。在

此答案提供了一个函数来转换JSON.NET网站一个Pythondatetime.datetime(timestamp)对象的字符串,以及两个函数,分别返回被截断为秒和毫秒的ISO格式。在

脚本:

# /Date(1154970000000+0700)/
# 0123456............7654321
# without timezone:
# /Date(1154970000000)/
# 0123456............21
# dodgy case
# /Date(-1234)/
# 3210987654321
import datetime

def json_date_as_datetime(jd):
    sign = jd[-7]
    if sign not in '-+' or len(jd) == 13:
        millisecs = int(jd[6:-2])
    else:
        millisecs = int(jd[6:-7])
        hh = int(jd[-7:-4])
        mm = int(jd[-4:-2])
        if sign == '-': mm = -mm
        millisecs += (hh * 60 + mm) * 60000
    return datetime.datetime(1970, 1, 1) \
        + datetime.timedelta(microseconds=millisecs * 1000)

def datetime_as_iso(dt):
    return dt.strftime("%Y-%m-%dT%H:%M:%SZ") # truncates

def datetime_as_iso_ms(dt): # with millisecs as fraction
    return dt.strftime("%Y-%m-%dT%H:%M:%S.%%03dZ") \
        % (dt.microsecond // 1000) # truncate    

if __name__ == "__main__":

    tests = """\
    /Date(1154970000000+0700)/
    /Date(-1234)/
    /Date(1000+0200)/
    /Date(0+0000)/
    /Date(0)/
    /Date(0-0700)/
    /Date(0-0730)/
    /Date(0-0030)/
    /Date(-1577923200000+0000)/
    /Date(1)/
    /Date(499)/
    /Date(500)/
    /Date(501)/
    /Date(999)/
    /Date(1000)/
    /Date(-1)/
    """.splitlines()

    for test in tests:
        test = test.strip()
        if not test: continue
        d = json_date_as_datetime(test)
        print datetime_as_iso_ms(d), test

输出:

^{pr2}$

返回时区感知日期时间,并为John Machin's test cases"/Date(1428145200000+1200)/"提供正确的输出

Python>;3.3兼容。对于2.7,使用pytz.utc而不是datetime.timezone.utc。在

from datetime import datetime, timedelta, timezone
import re


def jsondate(jsondate, tzinfo=timezone.utc):
    """Converts an ASP.NET json date: "/DATE(x)/" to tz-aware datetime object."""

    regex = (
        r"/Date\("
        r"(?P<milleseconds>[\-]?\d+)"
        r"(?P<offset>"
        r"(?P<offset_sign>[\+\-])"
        r"(?P<offset_hours>[01][0-9]|2[0-3])"
        r"(?P<offset_mins>[0-5][0-9])"
        r")?\)/"
    )
    try:
        parts = re.match(regex, jsondate).groupdict()
    except (AttributeError, TypeError):
        raise ValueError("Unsupported ASP.NET JSON Date Format: %s" % jsondate)

    since_epoch = timedelta(microseconds=1000 * int(parts['milleseconds']))
    if parts.get('offset'):
        since_epoch += timedelta(
            hours=int("%s%s" % (parts['offset_sign'], parts['offset_hours'])),
            minutes=int("%s%s" % (parts['offset_sign'], parts['offset_mins']))
        )
    return datetime(year=1970, month=1, day=1, tzinfo=tzinfo) + since_epoch

相关问题 更多 >