【发布时间】:2012-11-04 08:27:02
【问题描述】:
如果我使用 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)); // !!
}
【问题讨论】:
-
为什么您的示例代码费心将其写入磁盘?只需记住反序列化的字符串引用...
-
(顺便说一句,我非常怀疑您的工作站的时区是否真的是 UTC。我怀疑它是英国时区,冬天是 UTC,但夏天是 UTC+1 - 和日期你给的是夏天。)
-
@JonSkeet,迟来的:回复:你的第二条评论,如果你想把它作为答案发布,我会给你信用。 JSON 序列化并没有保留所有的 DateTime 状态以及夏令时。回复:第 1 项,示例代码是一个未完全简化的较大单元测试版本,其中问题已具体化。
-
我已将其添加到答案的底部。