如果我使用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)); // !!
}
Run Code Online (Sandbox Code Playgroud)
串行器显然将其转换为瞬间,从unix时代开始以毫秒为单位.换句话说,它ToUniversalTime()首先有效地呼叫.
此时,有关原始"种类"的任何信息DateTime都将丢失.
在反序列化时,结果总是一种DateTime类型的UTC.
如果你开始用DateTime带有一种UTC的,你会往返.如果您还需要记住这种类型,则需要单独保存这些数据.请记住,当地时间本身可能含糊不清.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Original: 20/06/2011 06:05:04 (Utc)
Text: "\/Date(1308549904003)\/"
Parsed: 20/06/2011 06:05:04 (Utc)
Run Code Online (Sandbox Code Playgroud)
当然,这只是突出了从概念上打破的问题DateTime ......
编辑:此外,正如评论中所述,我非常怀疑你的工作站的时区是否真的是UTC.我怀疑它是英国的时区,冬天是UTC,但夏天是UTC + 1 - 而且你给的日期是夏天.
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |