当您看到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));
}
}