54

我正在将 Web API 从 .NET Core 2.2 迁移到 3.0,并希望使用新的System.Text.Json. 使用时,我可以使用下面的代码Newtonsoft进行格式化。DateTime我怎样才能做到这一点?

.AddJsonOptions(options =>
    {
        options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
        options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZ";
    });
4

3 回答 3

76

使用自定义格式化程序解决。感谢 Panagiotis 的建议。

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        Debug.Assert(typeToConvert == typeof(DateTime));
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}


// in the ConfigureServices()
services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
     });
于 2019-09-25T16:53:53.957 回答
15

迁移到 Core 3 我不得不通过以下方式替换 System.Text.Json 才能再次使用 Newtonsoft:

services.AddControllers().AddNewtonsoftJson();

但是我在 Angular 应用程序中遇到了与 UTC 日期相同的问题,我必须添加它以获取 UTC 日期:

services.AddControllers().AddNewtonsoftJson(
       options => options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc);

在你的情况下,你应该能够做到这一点:

services.AddControllers().AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc;
        options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZ";
    });

它有效,我希望它有帮助......

于 2020-03-21T06:19:29.160 回答
1

当您看到Date.Parse() 和 Date.ParseExact()的垃圾箱火灾时,asp.net 核心日期序列化/序列化的垃圾箱火灾可能更容易理解。我们在 javascript 之间传递日期,所以我们不想格式化。我们只想在 UTC 中的 DateTime 和 ISO 8601 之间透明地序列化和反序列化

这不是默认设置,并且没有简单的配置选项,而且解决方案如此时髦和脆弱,这是在破坏信誉。这是目前对我有用的,基于D.English 的写作答案和阅读的链接答案,并使用这个答案正确访问 JsonDocument ......

更新这是针对模型绑定的 dumptser 火灾。对于查询字符串解析的垃圾箱大火,到此为止

// in Startup.cs ConfigureServices()

services.AddMvc().AddJsonOptions(options =>
{
    options.JsonSerializerOptions.Converters.Add(new UtcDateTimeConverter());
});


public class BobbyUtcDateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        Debug.Assert(typeToConvert == typeof(DateTime));
        using (var jsonDoc = JsonDocument.ParseValue(ref reader))
        {
            return DateTime.SpecifyKind(
                DateTime.Parse(jsonDoc.RootElement.GetRawText().Trim('"').Trim('\'')),
                DateTimeKind.Utc
            );
        }
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", System.Globalization.CultureInfo.InvariantCulture));
    }
}
于 2021-12-21T13:46:05.067 回答