如何使用JsonSerializer指定日期的默认时区?

3
我正在使用System.Text.Json来解析JSON数据。其中包含一个没有任何时间关联的日期字段。解析确实可以工作,我得到了一个日期时间,但是日期时间缺少时区信息,我将其发送到的网关由于缺少时区信息而拒绝它。
我碰巧知道这个默认时区实际上是 GMT+2。问题在于如何在解析过程中强制添加时区信息。
以下是一个简单的示例供您测试:
我有一个带有日期的简单类。
public class Testclass
{

    public DateTime RecordedDate { get; set; }
}

然后我有一个Json字符串。
 var json = "{ \"RecordedDate\": \"2017-11-22\"}"; 

然后我尝试解析它。
  var response =  JsonSerializer.Deserialize<Testclass>(json);

这段代码可以运行,但它没有包含时区信息,有没有一种方法可以指定默认时区?

enter image description here

2个回答

2
你可以创建一个 DateTimeConvertor 并根据你的需要处理转换。
public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.SpecifyKind(DateTime.Parse(reader.GetString()), DateTimeKind.Utc);
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {          
        writer.WriteStringValue(DateTime.SpecifyKind(value, DateTimeKind.Utc));
    }
}

在序列化/反序列化过程中使用转换器。

JsonSerializerOptions options = new JsonSerializerOptions();

options.Converters.Add(new DateTimeConverter());

var response = JsonSerializer.Deserialize<Testclass>(json, options);

var responseJson = JsonSerializer.Serialize(response, options);
responseJson将以所需格式包含日期时间。

反序列化后检查DateTime.Kind属性。 - Akshay G
这个效果非常好。我只需要弄清楚如何指定特定的时区即可。 - Linda Lawton - DaImTo
你可能正在寻找 DateTimeOffset?https://learn.microsoft.com/en-us/dotnet/api/system.datetimeoffset?view=net-5.0。因为 DateTime 没有时区信息。 - Akshay G
这个可行,但我认为最终我们需要在另一端进行修复。发送给我的系统需要开始发送时区偏移量,否则我会因此而疯掉。 - Linda Lawton - DaImTo

0

我认为这是默认设置。

据我所知,在反序列化(或序列化)过程中不应处理时区转换。在我看来,这些主题应该分开讨论。

如果我是你,我会在流程中获取DateTime后使用TimeZoneInfo.ConvertTime方法(或类似方法)。当然,这可能取决于您代码的逻辑。

您可能需要检查:

另一方面,Json.NET支持DateTimeZoneHandling,您可能也可以在反序列化时使用它。


很不幸的是,当日期被解析时,它们会被解析为2020-12-21T00:00:00,而我发送到网关的消息则指出必须附加时区。如果我手动添加一个Z,则可以正常工作。所以基本上我需要一种强制在末尾添加Z的方法。 - Linda Lawton - DaImTo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接