将JSON日期解析为C# DateTime

12

我有一个API可以从TargetProcess获取信息并将其放入SQL表中。

问题出现在当一个TargetProcess字段为日期时,因为我接收到的是JSON日期"/Date(1409202000000-0500 )/"

我该如何在C#中将这个JSON日期转换为DateTime?

我尝试过像这个StackOverflow帖子中的答案中添加额外的引号,但它不起作用。

我尝试替换单词“Date”,只使用1409202000000-0500

DateTime dotNetDate = new DateTime(197011);
dotNetDate = dotNetDate.AddMilliseconds(Convert.ToInt64(1409202000000-0500) 

我使用JSON.NET如下所示

string sa = "/Date(1409202000000-0500 )/"
DateTime dt = new DateTime();
dt = JsonConvert.DeserializeObject<DateTime>(sa);

但它也无法正常工作,

所以问题是...如何在C#中将此JSON日期转换为DateTime?


你使用哪种序列化程序来反序列化JSON?[tag:json.net]?[tag:javascriptserializer]?[tag:datacontractjsonserialize]?还是其他什么? - dbc
我正在使用json.NET。 - Victor Hernandez
1
如果我按照你链接的帖子所示更正了你的字符串字面量,你的代码就可以工作了。请参见https://dotnetfiddle.net/GiP6Sy。那么你真正的问题是什么? - dbc
是的,但在这种情况下,我如何添加String.Replace或String.Insert来将“/ Date(1409202000000-0500)/”转换为@"""/ Date(1409202000000-0500)/"", 别忘了我不能手动编写字符,因为它是从API获取并存储在数据库中的日期列表。 - Victor Hernandez
1
点赞了,这是@dbc的一个分支,https://dotnetfiddle.net/Z9ABCx - Aung Myo Linn
显示剩余2条评论
4个回答

20

你需要手动在你的字符串中添加引号,以确保它被正确格式化:

string sa = @"""" + "/Date(1409202000000-0500 )/" + @"""";
DateTime dt = JsonConvert.DeserializeObject<DateTime>(sa);

如果你需要多次调用它(似乎确实需要),只需将包装责任移动到一个方法中:

public string WrapStringInQuotes(string input)
{
    return @"""" + input + @"""";
}

1
点赞了,这是从评论中派生出来的@dbc的分支,https://dotnetfiddle.net/Z9ABCx - Aung Myo Linn
2
如果您可以访问更新版本的C#,您可以简化为:var dateTime = @"""/Date(1573074780000-0500)/""";我仍然不明白为什么默认转换没有加上引号就无法工作。 - Propagating

5
问题在于您的日期字符串格式不正确。
string sa = "/Date(1409202000000-0500 )/"

尝试

string sa = @"""/Date(1409202000000-0500)/""";

改变你的代码:

 string sa = @"""/Date(1409202000000-0500)/""";
            DateTime dt = new DateTime();
            dt = JsonConvert.DeserializeObject<DateTime>(sa);
            // dt = "2014-08-28 3.00.00 PM"

谢谢!我解决了。string sa = "/Date(1409202000000-0500 )/"; sa2 = @"""" + sa2 + @""""; - Victor Hernandez

0

这里是我的函数。甚至有可能你可以得到一个更短的数字,就像在OpenweatherAPI中日出和日落时间一样,那么在这种情况下,你需要乘以1000。我的函数处理这两种情况。

    public static DateTime GetDateTimeFromJSON(long jsonDateTime, bool shorter = false)
    {
        return JsonConvert.DeserializeObject<DateTime>($"\"\\/Date({ (shorter ? jsonDateTime * 1000 : jsonDateTime) })\\/\"", new JsonSerializerSettings
        {
            DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
        }).ToLocalTime();
    }

0
你可以使用我的函数,它不需要任何第三方引用。
    private DateTime JSONdateTime2dateTime(long JSONdatetimelong)
    {
        long DT_Tic = (JSONdatetimelong + 62135607600000) * 10000;
        return new DateTime(DT_Tic);
    }

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