gpt4 book ai didi

.net - .NET DateTime 往返的 JSON 序列化不起作用

转载 作者:行者123 更新时间:2023-12-03 04:59:53 26 4
gpt4 key购买 nike

如果我使用 System.Web.Script.Serialization.JavaScriptSerializer 保存 .NET DateTime,则反序列化版本与原始版本相差一个小时。有什么想法吗?

编辑:我的工作站的时区是 UTC。

下面是 NUnit 测试;请注意,该断言仅在添加一个小时后才有效。

    [Test]
public void JsonSerializationOfDateTimesDoesntWork()
{
var originalDateTime = new DateTime(2011, 6, 20, 6, 5, 4, 3);
const string fileName = "C:\\temp\\testDateTime.json";
using (var writer = new StreamWriter(fileName, false))
{
writer.Write(new JavaScriptSerializer().Serialize(originalDateTime));
}
DateTime newDateTime;
using (var reader = new StreamReader(fileName, false))
{
var readToEnd = reader.ReadToEnd();
newDateTime = new JavaScriptSerializer().Deserialize<DateTime>(readToEnd);
}

Assert.AreEqual(originalDateTime, newDateTime.AddHours(1)); // !!
}

最佳答案

序列化器显然将其转换为时间上的瞬间,以自unix纪元以来的毫秒形式。换句话说,它首先有效地调用 ToUniversalTime()

此时,有关 DateTime 原始“种类”的所有信息都会丢失。

反序列化时,结果始终是 UTC 类型的 DateTime

如果您开始使用具有某种 UTC 的 DateTime,那么您将进行往返。如果您还需要记住类型,则需要单独保存该数据。请记住,本地时间本质上可能是不明确的。

using System;
using System.Web.Script.Serialization;

class Test
{
public static void Main(string[] args)
{
var original = new DateTime(2011, 6, 20, 6, 5, 4, 3, DateTimeKind.Utc);
var serializer = new JavaScriptSerializer();
var text = serializer.Serialize(original);
var parsed = serializer.Deserialize<DateTime>(text);
Console.WriteLine("Original: {0} ({1})", original, original.Kind);
Console.WriteLine("Text: {0}", text);
Console.WriteLine("Parsed: {0} ({1})", parsed, parsed.Kind);
}
}

输出:

Original: 20/06/2011 06:05:04 (Utc)
Text: "\/Date(1308549904003)\/"
Parsed: 20/06/2011 06:05:04 (Utc)

当然,这只是突出显示 problems with DateTime being conceptually broken to start with ...

编辑:另外,正如评论中所指出的,顺便说一下,我非常怀疑您的工作站的时区是否真的是 UTC。我怀疑这是英国时区,冬季为 UTC,夏季为 UTC+1 - 而您给出的日期是夏季。

关于.net - .NET DateTime 往返的 JSON 序列化不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13402591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com