10

簡単に言うと、ServiceStack.Text の JSON パーサーを介して日付を往復すると、タイム ゾーン情報が失われます。奇妙なことに、DateTimeSerializerTests.DateTime_Is_Serialized_As_Utc_and_Deserialized_as_local()この動作を予期しているようで、UTC として解析されたすべての日時オブジェクトをDateTimeSerializer.Prepare()明示的に呼び出します!ToLocalTime()

テスト ケースの例を次に示します (MSTest ですが、どんな環境でも簡単に実行できます)。ローカルは渡しますが、UTC と Unspecified は渡しません。DateTime オブジェクトによって返される種類は常に「Local」です。

[TestMethod]
public void TestParseSingleDateTime_UTC()
{
    // In canonical UTC format
    var date = "2014-06-03T14:26:20.0030000Z";
    var raw = new DateTime(2014, 6, 3, 14, 26, 20, 3, DateTimeKind.Utc);
    var value = DateTimeSerializer.ParseShortestXsdDateTime(date);
    Assert.AreEqual(DateTimeKind.Utc, value.Kind);
    Assert.AreEqual(raw, value);
}

[TestMethod]
public void TestParseSingleDateTime_Local()
{
    // In local time zone
    var date = "2014-06-02T11:15:49.1480000-05:00";
    var raw = new DateTime(2014, 6, 2, 11, 15, 49, 148, DateTimeKind.Local);
    var value = DateTimeSerializer.ParseShortestXsdDateTime(date);
    Assert.AreEqual(DateTimeKind.Local, value.Kind);
    Assert.AreEqual(raw, value);
}

[TestMethod]
public void TestParseSingleDateTime_Unspecified()
{
    // Unspecified time zone, as we would parse from Excel cells with dates
    var date = "2012-01-06T00:00:00.0000000";
    var raw = new DateTime(2012, 1, 6, 0, 0, 0, DateTimeKind.Unspecified);
    var value = DateTimeSerializer.ParseShortestXsdDateTime(date);
    Assert.AreEqual(DateTimeKind.Unspecified, value.Kind);
    Assert.AreEqual(raw, value);
}

なぜこのデフォルトの動作なのですか?JsConfig.AlwaysUseUtcローカルのタイムスタンプをローカルとして解析することもできないため、ここでの使用は良い回避策ではありません。

4

1 に答える 1