2

System.Web.Script.Serialization.JavaScriptSerializerを使用して.NETDateTimeを保存すると、逆シリアル化されたバージョンは元のバージョンと1時間異なります。なぜ何かアイデアはありますか?

編集:私のワークステーションのタイムゾーンはUTCです。

NUnitテストは以下のとおりです。アサーションは1時間を追加した後にのみ機能することに注意してください。

    [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)); // !!
    }
4

2 に答える 2

6

シリアライザーは、UNIXエポックからのミリ秒の形式でそれを瞬間に変換するようです。言い換えれば、それは事実上ToUniversalTime()最初に呼び出しています。

その時点で、元の「種類」に関する情報はすべてDateTime失われます。

デシリアライズでは、結果は常にDateTime一種のUTCになります。

ある種の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)

もちろん、これは、最初に概念的に壊れていることの問題をDateTime浮き彫りにしているだけです...

編集:また、コメントに記載されているように、私はあなたのワークステーションのタイムゾーンが本当にUTCであることを非常に疑っています。冬はUTCですが、夏はUTC + 1である英国のタイムゾーンであると思われます。また、指定した日付は夏です。

于 2012-11-15T17:55:19.843 に答える
0

JsonConvert.DeserializeObject代わりに使用してください。正しい日時が保持されます

于 2015-04-09T19:28:53.323 に答える