gpt4 book ai didi

c# - 使用 NodaTime 正确处理开放时间

转载 作者:可可西里 更新时间:2023-11-01 03:08:53 26 4
gpt4 key购买 nike

我目前正在编写一个相当简单的应用程序来处理企业的开/关时间,但在试图弄清楚如何正确存储信息时遇到了严重的困难。

我们的大部分关键功能都在很大程度上依赖于让时间绝对完美,所以显然我希望以最好的方式开始工作!

此外,数据将由用户输入,因此如果底层表示稍微复杂一些(例如,使用 TimeSpans 来计算午夜后的营业时间),这需要对用户不可见。

我需要首先存储公司的营业时间,按星期几,以及与之关联的时区,例如:

- M:  1000 - 2330
- T: 1000 - 0030
- W: 1900 - 0300
- Th: 2000 - 0300
- F: 2000 - 0800
- Sa: 1000 - 0500
- Su: 1000 - 2300

我目前认为最好的存储方式是使用这样的类:

public class OpeningHours
{
ZonedDateTime OpeningTime { get; set; }
Period durationOpen { get; set; }

// TODO: add a method to calculate ClosingTime as a ZonedDateTime
}

但是,这里有两个主要的复杂问题:

  • 我不想存储 ZonedDateTime 的年、月或日期部分 - 我只关心 DayOfWeek。

    当然,我可以将每个值存储为 1970 年 1 月 1 日之后的第一个星期一/星期二等,但这看起来很老套而且很明显是错误的 - 正如 NodaTime 的作者非常正确地解释的那样 here 在谈到 BCL DateTime 实现的局限性时。我也有一种感觉,如果稍后我们尝试对日期进行任何算术运算,这可能会以奇怪的古怪错误告终。

  • 无论如何,用户都必须输入 ClosingTime。客户端我想我可以做一些简单的事情,比如总是假设 ClosingTime 在 OpeningTime 之前是第二天,但同样,它并不完美,而且也没有考虑可能开放超过 24 小时的地方(例如超市)

我考虑过的另一件事是使用包含小时/天的表格并让人们突出显示一周中的几个小时以选择开放时间,但您仍然遇到同样的问题,只想存储 OpeningTime 的 DayOfWeek 部分.

如有任何建议,我们将不胜感激,过去 6 小时阅读我们人类代表时间的滑稽愚蠢方式让我有点精疲力竭!

最佳答案

我会强烈考虑使用 LocalTime 而不是 ZonedDateTime,原因如下:

  • 您并不是要代表时间中的单个瞬间;这些是自然重复的模式(没有关联的日期)
  • 您不是要应对商店在不同时区营业时间不同的情况;您可能希望将时区与每个商店关联一次,然后您可以随时应用该时区

所以我会有这样的东西(只显示数据成员;如何整理行为是另一回事):

public class StoreOpeningPeriod
{
IsoDayOfWeek openingDayOfWeek;
LocalTime openingTime;
LocalTime closingTime;
}

请注意,这完全遵循您显示的原始数据,这始终是一个好兆头 - 您既没有添加也没有丢失信息,而且它可能采用方便的形式。

如果收盘时间早于开盘时间,则假定已过了午夜 - 如果这种情况相对不常见,您可能需要为用户添加一个确认框,但在代码中很容易发现和处理。

关于c# - 使用 NodaTime 正确处理开放时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15735484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com