gpt4 book ai didi

c# - 是否可以为 DateTimeOffset 的 JSON.NET 反序列化指定一个偏移量?

转载 作者:行者123 更新时间:2023-12-02 17:39:13 25 4
gpt4 key购买 nike

以下语句打印“1/1/0001 4:00:00 PM -05:00”

Console.WriteLine(JsonConvert.DeserializeObject<DateTimeOffset>("\"0001-01-01T16:00:00\""));

这是因为当 json.net 将 DateTime 字符串(没有偏移量)反序列化为 DateTimeOffset 对象时,它会分配本地偏移量,在本例中为 -05:00。

如果我不想使用本地偏移怎么办?有什么方法可以指定用于此反序列化的偏移量吗?

(用例是数据库服务器和网络服务器在不同的时区,我需要具有未指定时区的传入请求在反序列化后具有数据库服务器的偏移量。)

更新:我无法控制传入时间字符串的格式。我有一个数据传输对象类,它有一个 DateTimeOffset 属性,我需要将传入的时间数据存储到这个属性中。

最佳答案

您要反序列化的类型应该与您期望的数据相匹配。如果您不希望包含偏移量,则不要反序列化为 DateTimeOffset。相反,反序列化为 DateTime。它的 .Kind 属性将具有 DateTimeKind.Unspecified

您对网络服务器时区的了解与反序列化任务无关。因此,事后单独应用它。

// 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 .

关于c# - 是否可以为 DateTimeOffset 的 JSON.NET 反序列化指定一个偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22846319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com