【问题标题】:Error converting value \"02:30:40\" to type 'System.TimeOnly'将值 \\\"02:30:40\\\" 转换为类型 \'System.TimeOnly\' 时出错
【发布时间】:2022-08-15 17:43:11
【问题描述】:

我正在做一个 .net6.0 项目(使用 postgreSql)

我想将办公室的开始时间和休息时间保存到数据库中。

我这样做了。

public class WorkingDay
{
    public int Id { get; set; }

    public DaysOfWeek Day { get; set; }  // enum

    public OpeningHours OpeningHours { get; set; }

    public bool IsworkingDay { get; set; }
}


public class OpeningHours
{
    public TimeOnly StartTime { get; set; }

    public TimeOnly OffTime { get; set; }

}

现在我发送数据以使用 POSTMAN 创建。

{
    \"Day\" : 1,
    \"OpeningHours\" : {
        \"StartTime\":  \"02:30:40\", 
        \"OffTime\" :  \"02:30:40\"
    },
    \"IsworkingDay\" : false
}

我得到了以下错误。 Error converting value \\\"02:30:40\\\" to type \'System.TimeOnly\'. Path \'OpeningHours.OffTime\',

如何发送TimeOnly 的数据?

标签: c# asp.net-core .net-6.0


【解决方案1】:

DateOnlyTimeOnly 当前 (.NET 6) 不受 System.Text.Json 支持。但是,它们将在 .NET 7 中实现,如 this github issue

目前有多种解决方法。

  • 将它们转换为DateTimeDateTimeOffset 并返回以进行序列化。
  • 切换到 .NET 7 预览版进行开发
  • 将 .NET 7 实现复制到您的代码中(请参阅pull request
  • 编写你自己的转换器(可以找到一个例子in this link

【讨论】:

    【解决方案2】:

    我建议使用TimeSpans(直到.NET 7):

    public class OpeningHours
    {
        public TimeSpan StartTime { get; set; }
    
        public TimeSpan OffTime { get; set; }
    }
    

    以后需要的时候可以TimeOnly.FromTimeSpan()

    【讨论】:

      【解决方案3】:

      JHBonarius 提供了 chock-a-block 选项列表。

      但是,这次要继续使用 .net 的 LTS 版本(仅支持 .net 6)并继续使用 TimeOnly,您需要实现 TimeOnlyJsonConverter。

      我想添加到 JHBonarius 答案中的唯一一件事 - TimeOnlyJsonConverter 针对您的情况的完整示例:

      public class TimeOnlyJsonConverter : JsonConverter<TimeOnly>
      {
          private const string Format = "HH:mm:ss.fff";
      
          public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
          {
              var str = reader.GetString();
              return string.IsNullOrEmpty(str) ? default : TimeOnly.ParseExact(str, Format, CultureInfo.InvariantCulture);
          }
      
          public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
          {
              writer.WriteStringValue(value.ToString(Format, CultureInfo.InvariantCulture));
          }
      }
      
      public class OpeningHours
      {
          [JsonConverter(typeof(TimeOnlyJsonConverter))]
          public TimeOnly StartTime { get; set; }
      
          [JsonConverter(typeof(TimeOnlyJsonConverter))]
          public TimeOnly OffTime { get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-15
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 2020-11-25
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        • 2021-11-20
        相关资源
        最近更新 更多