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)
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)
它有效,我希望它有所帮助...
小智 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)
| 归档时间: |
|
| 查看次数: |
1967 次 |
| 最近记录: |