我想知道如何向来自不同时区的用户呈现一个日期(不包含时间)。假设日期存储在某个数据库中,该数据库运行在某个时区(例如UTC+6),应用服务器也在同一台机器上运行(或至少在同一时区内)。应用程序必须处理两种临时值:A/DateTime(例如2013-08-20 08:00 UTC)和B/Date(例如2013-08-20)。
A / DateTime很容易处理,因为它代表历史上的某个特定点。例如登月。它以UTC格式存储在数据库中,每当呈现给客户端时,都会被移动到他的时区,以适应他的现实。因此,2013-08-20 08:00 UTC = 2013-08-20 14:00 UTC +6 = 2013-08-19 22:00 UTC-10。每个客户端都在观看时间轴上的同一点=从他的角度看相同的事件,一切都很顺利。
B/Date = THE PROBLEM。这种类型的临时值代表历史上的特定一天。由于它没有时间元素,因此无法转换到不同的时区。将日期与归零的时间组件一起存储似乎很容易,例如2013-08-20 00:00 UTC,并将其呈现给用户时去掉时间组件。但是,在转换后,这将导致UTC-x时区的2013-08-19,这是错误的,因为我们不知道这个历史点在世界上哪个地方被认为是昨天,哪个地方仍然是今天。实际上,在某些情况下,地球上有三个不同的日期(http://en.wikipedia.org/wiki/International_Date_Line)。
问题的很好的例子是发票的到期日期。当您在UTC +6时区发出到期日期为2013-08-20的发票并将其存储在基于UTC的服务器上时,中国的某个人应该何时支付?它是基于UTC的服务器上的2013-08-19还是仍然是2013-08-20?
提出问题:
没有时间元素的日期应如何存储和处理,以便能够向来自多个时区(包括超过12小时的差异)的客户提供服务?它应该移动吗?应该保持相同的日期吗?您如何在项目中处理这种情况?
非常感谢您阅读到这里。欢迎任何参考或想法。我唯一能接触到的相关材料是之前提到的维基文章,但老实说,我不确定我的问题是否有答案。大多数文章都与日期时间转换相关,但该部分已经处理得很好了。
附:应用程序服务器是使用Java编写的,因此我将此问题标记为与Java相关,以鼓励提供Java特定的解决方案(如果有)。
问题的很好的例子是发票的到期日期。当您在UTC +6时区发出到期日期为2013-08-20的发票并将其存储在基于UTC的服务器上时,中国的某个人应该何时支付?它是基于UTC的服务器上的2013-08-19还是仍然是2013-08-20?
提出问题:
没有时间元素的日期应如何存储和处理,以便能够向来自多个时区(包括超过12小时的差异)的客户提供服务?它应该移动吗?应该保持相同的日期吗?您如何在项目中处理这种情况?
非常感谢您阅读到这里。欢迎任何参考或想法。我唯一能接触到的相关材料是之前提到的维基文章,但老实说,我不确定我的问题是否有答案。大多数文章都与日期时间转换相关,但该部分已经处理得很好了。
附:应用程序服务器是使用Java编写的,因此我将此问题标记为与Java相关,以鼓励提供Java特定的解决方案(如果有)。