close/open 的 Noda 时间表示是一整天(24 小时)

Noda time representation for close/open that is an entire day (24 hour period)

我正在解析来自 https://raw.githubusercontent.com/QuantConnect/Lean/master/Data/market-hours/market-hours-database.json

的一些格式有趣的数据

它包含一个片段(删除了一些日子)如下:

"Future-cme-[*]": {
      "dataTimeZone": "UTC",
      "exchangeTimeZone": "America/Chicago",
      "monday": [
        {
          "start": "00:00:00",
          "end": "1.00:00:00",
          "state": "market"
        }
      ],
      "friday": [
        {
          "start": "00:00:00",
          "end": "16:00:00",
          "state": "market"
        }
      ]
}

我正在使用 JsonConverter<LocalTime> 来转换上面的内容,我可以毫无问题地将 friday 属性 startend 解析为 LocalTime.

然而,这代表一整天的日期,即 1.00:00:00 它会引发错误,因为它不是 ISO 格式 - 这引发了关于我(不正确!)使用结构的问题.

目前我有如下使用 LocalTime 的格式:

public class MarketHoursSegment
{
    public LocalTime Start { get; init; }
    public LocalTime End { get; init; }
    public MarketHoursState State { get; init; }
}

格式化程序:

public class LocalTimeConverter : JsonConverter<LocalTime>
{
    public override LocalTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
         return LocalTimePattern
                    .GeneralIso
                    .Parse(reader.GetString())
                    .GetValueOrThrow();
    }

    public override void Write(Utf8JsonWriter writer, LocalTime value, JsonSerializerOptions options)
    {
        writer.WriteStringValue(value.ToString());
    }
}

是否有更好的方法来处理表示 24 小时跨度的 LocalTime?

  1. 我会在 reader.GetString() 中检测到 1:00:00:00 转换器,如果设置为 00:00:00(午夜)并检查是否 Start == End那我们就知道是整整24小时了?

  2. 或者将 Start 作为 LocalTime 更正确, 和 End => Start + Duration?

    的持续时间(即 24 小时)

Is there a preferred way to deal with a LocalTime that represents a 24 hours span?

值得退后一步,非常仔细和准确地区分不同的概念。 LocalTime 不代表 24 小时的跨度 - 它只是一天中的一个时间。 两个 LocalTime 值可以有效地表示 24 小时跨度而不参考特定日期,是的。

如果您可以将 JSON 更改为使用 00:00:00,然后将“开始==结束”情况视为一整天,那么我会这样做。但是,这确实意味着您永远无法表示 句点。

现在,就您是否应该使用开始和持续时间而言...这实际上取决于您尝试建模的内容。您是要模拟开始时间和结束时间,还是开始时间和持续时间?到目前为止,您将一整天称为“24 小时跨度”,但情况并非总是如此,如果您正在处理具有 UTC 偏移转换的时区(例如,由于夏令时)。

转换已经导致像这样的本地时间间隔的潜在问题 - 如果你正在处理本地时间从凌晨 2 点“倒退”到凌晨 1 点的日期,并且你有一个本地时间段(例如) 00:30 到 01:30,那么从逻辑上讲,这将在一天的一个半小时内为“真”:

  • 00:00-00:30:错误
  • 00:30-01:30(第一次):正确
  • 01:30-02:00(第一次):假
  • 01:00-01:30(第二次):真
  • 01:30-02:00(第二次):假
  • 02:00-00:00(次日):假

我们真的不知道你在做什么,但这是你需要考虑的事情......同样,如果你将某些东西表示为“24 小时的 00:00”在只有 23 小时或 25 小时的一天工作?它将 非常 在很大程度上取决于您对数据的处理方式。

我会采用以下流程:

  • 制定详细的要求,包括您希望在特定时区中使用 UTC 偏移转换的日子发生什么(并在此阶段考虑测试)
  • 根据 Noda Time 类型从这些要求中提取逻辑值(限制是不,很遗憾,我们不支持 24:00:00 作为 LocalTime
  • 在您的 JSON 中尽可能地代表这些类型
  • 使您的代码在处理数据的方式方面尽可能地遵循您的需求文档