鉴于国际化,“只是没有时间的约会”真的是一个有效的概念吗?

Goo*_*ide 1 timezone datetime internationalization jodatime nodatime

我总是在概念上遇到麻烦,将日期值表示为没有时间的对象(例如,SQL具有DATE旁边的类型DATETIME)。同样的想法经常会产生用总是存储日期和时间(例如C#DateTime)的语言的问题。突然出现时区错误,开发人员坚持认为所有时区hullabaloo都可以忽略,因为它们DateTime实际上只是“一个日期”。但这到底意味着什么?

在我看来,这样的“纯正日期”只能用两种方式解释:

  1. 从时间点(即“即时”)的角度,可以推断出“ 2019-09-17”表示一天的开始(结束),即“ 2019-09-17 00:00:00”(“ 2019-09-17 23:59:59“)。因此,时区信息是相关的,我们不是在谈论“只是一个日期”。
  2. 另一个选择是日期应该是一整天,因此我们实际上是在谈论从“ 2019-09-17 00:00:00”到“ 2019-09-17 23:59:59” 的时间跨度时区信息也不能忽略。

我认为所有“普通日期”用例都属于这两种类别,并且仅当软件仅在配置了完全相同时区的系统上运行并与之通信时,才可以忽略时间/时区。

有人可以提供反例或第三种解释吗?

How*_*ant 6

“假期”是没有时间甚至没有时区的日期的示例。

大多数假期本质上都是宗教性的,我不想发动宗教战争,也不想被细节遗忘。举个例子,我将在民用日历中选择世界地球日:每年的4月22日。

如果您编写用于处理假期的软件,则该软件不一定能处理整个星球上的即时事件(尽管除了跟踪假期外,它还可以做到这一点)。相反,它带有将每年4月22日映射为世界地球日的概念。与某些人在其他人之前或之后庆祝世界地球日无关,这是无关紧要的。

如果客户想确切地知道世界地球日的开始/结束时间,那么他可以使用其特定时区将“日期”转换为特定的时间点。需要翻译不会减少日期的价值(例如2020-04-22)。

C ++ 20将使用多种数据结构来表示“无时区日期”(例如2020-04-22)的几种类型:

local_days         // day 18374                   == April/22/2020
year_month_day     // year 2020, month 4, day 22  == April/22/2020
year_month_weekday // year 2020, month 4, 4th Wed == April/22/2020
Run Code Online (Sandbox Code Playgroud)

  • 我认为没有必要深入探讨生日折扣问题的细节。在这种情况下,很容易想到既涉及时区又涉及不时区的规则。如果您正在寻找更多的示例,这些示例中的无区域日期很有用,那么我可以提供更多。日历之间的转换。抵押计算。根据名人哺乳动物的妊娠期预测的未来日期。监狱释放日期。旅馆预订。计算工作日。什么时候是狩猎季节。互动历史展览。历史平均气温。图书出版日期。 (2认同)