close/open 的 Noda 时间表示是一整天(24 小时)
Noda time representation for close/open that is an entire day (24 hour period)
的一些格式有趣的数据
它包含一个片段(删除了一些日子)如下:
"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
属性 start
和 end
解析为 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?
我会在 reader.GetString()
中检测到 1:00:00:00
转换器,如果设置为 00:00:00(午夜)并检查是否
Start == End
那我们就知道是整整24小时了?
或者将 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 中尽可能地代表这些类型
- 使您的代码在处理数据的方式方面尽可能地遵循您的需求文档
它包含一个片段(删除了一些日子)如下:
"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
属性 start
和 end
解析为 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?
我会在
reader.GetString()
中检测到1:00:00:00
转换器,如果设置为 00:00:00(午夜)并检查是否Start == End
那我们就知道是整整24小时了?或者将
的持续时间(即 24 小时)Start
作为LocalTime
更正确, 和End => Start + Duration
?
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 中尽可能地代表这些类型
- 使您的代码在处理数据的方式方面尽可能地遵循您的需求文档