你要反序列化到要匹配的數據類型你正在期待。如果您不希望包含偏移量,則不要反序列化爲DateTimeOffset
。相反,反序列化爲DateTime
。它的.Kind
財產將有DateTimeKind.Unspecified
。
關於Web服務器時區的知識與反序列化的任務無關。所以事後分開應用它。
// deserialize the json
DateTime dt = JsonConvert.DeserializeObject<DateTime>("\"2014-01-01T00:00:00\"");
// find your target time zone
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
// apply the time zone to determine the offset, and create the DateTimeOffset
DateTimeOffset dto = new DateTimeOffset(dt, tz.GetUtcOffset(dt));
更新
每評論,如果你需要做在您所要求的方式來解決此轉換,您需要一個自定義的JSON轉換器。這應該做的伎倆:
public class CustomDateTimeConverter : IsoDateTimeConverter
{
private readonly string defaultTimeZoneId;
public CustomDateTimeConverter(string defaultTimeZoneId)
{
this.defaultTimeZoneId = defaultTimeZoneId;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (objectType != typeof (DateTimeOffset) && objectType != typeof (DateTimeOffset?))
return base.ReadJson(reader, objectType, existingValue, serializer);
var dateText = reader.Value.ToString();
if (objectType == typeof(DateTimeOffset?) && string.IsNullOrEmpty(dateText))
return null;
if (dateText.IndexOfAny(new[] { 'Z', 'z', '+'}) == -1 && dateText.Count(c => c == '-') == 2)
{
var dt = DateTime.Parse(dateText);
var tz = TimeZoneInfo.FindSystemTimeZoneById(this.defaultTimeZoneId);
var offset = tz.GetUtcOffset(dt);
return new DateTimeOffset(dt, offset);
}
return DateTimeOffset.Parse(dateText);
}
}
然後你就可以在轉換過程中連線起來:
var settings = new JsonSerializerSettings();
settings.DateParseHandling = DateParseHandling.None;
settings.Converters.Add(new CustomDateTimeConverter(defaultTimeZoneId: "Eastern Standard Time"));
DateTimeOffset dto = JsonConvert.DeserializeObject<DateTimeOffset>("\"2014-01-01T00:00:00\"", settings);
請務必使用一個有效的時區ID。不要使用固定的偏移量。
另外,如果您嘗試在沒有日期的情況下傳遞時間,這將不是正確的方法。這是一個完全不同的問題,並通過0001-01-01
爲日期不是一個好方法。我很樂意與您討論in chat。
嗯,問題是,我們必須支持這兩種類型的時間,區域未指定和區域特定的,具有DateTimeOffset屬性。 – Zoomzoom
而且我無法更正反序列化的DateTimeOffset對象,因爲我無法分辨對象是否帶有偏移量,因此不需要更正,或者它沒有偏移量並且被分配了本地偏移量。 – Zoomzoom
是您的數據合同的一部分 - 您會支持模糊的輸入數據嗎?如果是這樣,我不明白你會如何輕鬆解決它。 –