长话短说——通过 ServiceStack.Text 的 JSON 解析器往返的日期会丢失时区信息。奇怪的是,DateTimeSerializerTests.DateTime_Is_Serialized_As_Utc_and_Deserialized_as_local()
似乎期待这种行为,并DateTimeSerializer.Prepare()
显式调用ToLocalTime()
每个被解析为 UTC 的日期时间对象!
这是一个示例测试用例(MSTest,但很容易在任何情况下运行)。本地通行证,但 UTC 和未指定不 - DateTime 对象返回的类型始终为“本地”。
[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
不是一个好的解决方法,因为这样我也无法将本地时间戳解析为本地时间戳。