很明显,在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
答案 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);
}