我总是在概念上遇到麻烦,将日期值表示为没有时间的对象(例如,SQL具有DATE
旁边的类型DATETIME
)。同样的想法经常会产生用总是存储日期和时间(例如C#DateTime
)的语言的问题。突然出现时区错误,开发人员坚持认为所有时区hullabaloo都可以忽略,因为它们DateTime
实际上只是“一个日期”。但这到底意味着什么?
在我看来,这样的“纯正日期”只能用两种方式解释:
从时间点(即“即时”)的角度,可以推断出“ 2019-09-17”表示一天的开始(结束),即“ 2019-09-17 00:00:00”(“ 2019-09-17 23:59:59“)。因此,时区信息是相关的,我们不是在谈论“只是一个日期”。
另一个选择是日期应该是一整天,因此我们实际上是在谈论从“ 2019-09-17 00:00:00”到“ 2019-09-17 23:59:59” 的时间跨度时区信息也不能忽略。
我认为所有“普通日期”用例都属于这两种类别,并且仅当软件仅在配置了完全相同时区的系统上运行并与之通信时,才可以忽略时间/时区。
有人可以提供反例或第三种解释吗?
“假期”是没有时间甚至没有时区的日期的示例。
大多数假期本质上都是宗教性的,我不想发动宗教战争,也不想被细节遗忘。举个例子,我将在民用日历中选择世界地球日:每年的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