使用System.Text.Json在ASP.NET Core 3.0中格式化DateTime

D. *_*ish 7 c# datetime json asp.net-core system.text.json

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

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

D. *_*ish 10

使用自定义格式化程序解决。谢谢帕纳吉奥蒂斯的建议。

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());
     });
Run Code Online (Sandbox Code Playgroud)

  • 问题是关于 System.Text.Json 而不是 NewtonSoft.Json (4认同)
  • 15 行代码,启动中的一个脆弱修改,只是为了在我的 API 输出中拥有完整明确的日期。这会影响可信度。 (3认同)

Jua*_*uan 10

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

services.AddControllers().AddNewtonsoftJson();
Run Code Online (Sandbox Code Playgroud)

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

services.AddControllers().AddNewtonsoftJson(
       options => options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 问题不是关于 newtonsoft.json (2认同)

小智 5

这或多或少与其他人建议的相同,但需要额外的步骤将格式字符串作为属性中的参数。

格式化程序:

public class DateTimeFormatConverter : JsonConverter<DateTime>
{
    private readonly string format;

    public DateTimeFormatConverter(string format)
    {
        this.format = format;
    }

    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.ParseExact(
            reader.GetString(),
            this.format,
            CultureInfo.InvariantCulture);
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        ArgumentNullException.ThrowIfNull(writer, nameof(writer));

        writer.WriteStringValue(value
            .ToUniversalTime()
            .ToString(
                this.format,
                CultureInfo.InvariantCulture));
    }
}
Run Code Online (Sandbox Code Playgroud)

由于JsonConverterAttribute没有密封,我们可以这样做:

public sealed class JsonDateTimeFormatAttribute : JsonConverterAttribute
{
    private readonly string format;

    public JsonDateTimeFormatAttribute(string format)
    {
        this.format = format;
    }

    public string Format => this.format;

    public override JsonConverter? CreateConverter(Type typeToConvert)
    {
        return new DateTimeFormatConverter(this.format);
    }
}
Run Code Online (Sandbox Code Playgroud)