Dart和ASP.NET核心ISO-8601分数秒解析不兼容

时间:2019-05-30 16:22:24

标签: datetime asp.net-core dart iso8601

很明显,在ASP.NET Core中使用DateTime对象时,JSON.Net会将它们序列化为7位精度。

示例:

 "registrationDate": "2019-05-30T09:21:05.1676144-04:00",

    "registrationDate": "2019-05-30T15:34:04.0929048Z",

在飞镖垫中

 var t = DateTime.parse('2019-05-30T15:34:04.0929048Z');

产量:

Uncaught exception:
FormatException: Invalid date format
2019-05-30T15:34:04.0929048Z

但是当我修整最后一位数字(“ 8”)时:

 var t = DateTime.parse('2019-05-30T15:34:04.092904Z');

产量:

2019-05-30 15:34:04.093Z

通过API在Dart中使用它们时,Dart仅接受六位数字的精度,并且在遇到第七位数字时会抛出错误。

以下是Dart文档的链接: https://api.dartlang.org/stable/2.3.1/dart-core/DateTime/parse.html

这是他们文档中的相关代码:

  int parseMilliAndMicroseconds(String matched) {
     if (matched == null) return 0;
     int length = matched.length;
     assert(length >= 1);
     assert(length <= 6);

由于Dart是一个非常基础的库,因此不太可能很快就在Dart上进行修复。

那么,谁能告诉我如何让我的ASP.NET Core API将准确度降低一位?这些日期在系统中的任何地方,如果我只需从一个位置更改格式化的输出,那将非常好。

我想一种替代方法是写一个JsonConverter,但我真的不想在每个班级都这样做。

想法?

TIA

2 个答案:

答案 0 :(得分:0)

似乎有两种方法,一种是使用Json.Net的CustomContractResolver。我之所以没有这么做,是因为我想到我可能最终需要用这七个数字来在不受Dart限制的其他地方进行比较。

所以我改用了JsonConverter。这是代码:

public class DartDateTimeConverter : IsoDateTimeConverter
{
    public DartDateTimeConverter()
    {
        DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFK";
    }
}

请注意,“ F”位置只有6个多头。

我直接从another SO example那里拿走了。

然后我将数据传输对象更新为具有相关属性:

[JsonConverter(typeof(DartDateTimeConverter))]
[JsonProperty("registrationDate")]
public DateTime RegistrationDate { get; set; }

希望这对某人有帮助。

答案 1 :(得分:0)

@ bill-noel对于属性的答案非常有效。如果这不是标准模型的一部分,则可以手动进行操作,如下所示:

public static string GetCustomAccuracyISO8601DateString(DateTime dateTime, int accuracy = 6)
{
   accuracy = accuracy > 6 ? 6: (accuracy > 12 ? 12: accuracy);
   return dateTime.ToString($"yyyy-MM-ddTHH\\:mm\\:ss.{new String('f', accuracy)}Z", CultureInfo.InvariantCulture);
}