我正在構建Web API,並且在使用DateTimes
的JSON序列化時遇到問題。在做了一些測試之後,我只能得出結論,Newtonsoft.Json.JsonConvert
和/或Newtonsoft IsoDateTimeConverter
的行爲不是我所期望的。爲什麼在使用DateTimeStyles.AssumeUniversal時,JsonConvert會使用DateTimeKind.Unspecified更改DateTimes的時間?
考慮一下:
// Arrange
var noonUtc = new DateTime(2016, 05, 12, 12, 0, 0, DateTimeKind.Utc);
var noon = new DateTime(2016, 05, 12, 12, 0, 0, DateTimeKind.Unspecified);
var settings = new JsonSerializerSettings();
settings.Converters.Add(new IsoDateTimeConverter
{
Culture = CultureInfo.InvariantCulture,
DateTimeStyles = DateTimeStyles.AdjustToUniversal
});
// Act
var utcJson = JsonConvert.SerializeObject(noonUtc, settings); // "\"2016-05-12T12:00:00Z\""
var json = JsonConvert.SerializeObject(noon, settings); // "\"2016-05-12T10:00:00Z\""
... // Assertions
好了,所以爲DateTime
與DateTimeKind.Unspecified
的時間已經從12點調整到10點。我現在在斯德哥爾摩,現在比UTC的時間提前了兩個小時,非常合適。
然而,讓我們改變串行設置使用DateTimeStyles.AssumeUniversal
,像這樣:
settings.Converters.Add(new IsoDateTimeConverter
{
Culture = CultureInfo.InvariantCulture,
DateTimeStyles = DateTimeStyles.AssumeUniversal
});
這將導致確切相同字符串,從而也兩個小時調整DateTime
與DateTimeKind.Unspecified
!不應該假定日期時間已經是UTC時間,並且保持原樣?我在這裏錯過了什麼?