簡単に言うと、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
ローカルのタイムスタンプをローカルとして解析することもできないため、ここでの使用は良い回避策ではありません。