簡體   English   中英

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

[英]Formatting DateTime in ASP.NET Core 3.0 using System.Text.Json

I am migrating a web API from .NET Core 2.2 to 3.0 and want to use the new System.Text.Json . 使用Newtonsoft時,我可以使用下面的代碼格式化DateTime 我怎樣才能做到這一點?

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

使用自定義格式化程序解決。 感謝 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());
     });

遷移到 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";
    });

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

當您看到Date.Parse() 和 Date.ParseExact() 的垃圾箱火災時,asp.net 核心日期序列化/序列化的垃圾箱火災可能更容易理解。 我們在 javascript 之間傳遞日期,所以我們不想格式化。 我們只想在 UTC 中的 DateTime 和 ISO 8601 之間透明地序列化和反序列化 這不是默認設置,沒有配置選項,而且解決方案如此時髦和脆弱,真是令人尷尬。 這是目前對我有用的,基於D.English 的寫作答案和閱讀的鏈接答案......

// in Startup.cs ConfigureServices()

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


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

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", System.Globalization.CultureInfo.InvariantCulture));
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM