Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向来自不同时区的用户显示日期(不含时间元素)?_Java_Database_Date_Datetime_Timezone - Fatal编程技术网

Java 如何向来自不同时区的用户显示日期(不含时间元素)?

Java 如何向来自不同时区的用户显示日期(不含时间元素)?,java,database,date,datetime,timezone,Java,Database,Date,Datetime,Timezone,我想知道如何向来自不同时区的用户显示日期(不带时间元素)。假设日期存储在某个服务器上的某个数据库中,该服务器运行在某个时区(例如UTC+6),而应用程序服务器运行在同一台机器上(或至少在同一时区)。应用程序必须处理两种时间值:A/DateTime(例如2013-08-20 08:00 UTC)和B/Date(例如2013-08-20) A/DateTime很容易处理,因为它代表了历史上的某个特定点。比如登月。它存储在数据库中的UTC中,每当它呈现给客户时,它都会转移到他的时区中,以适合他的实际情

我想知道如何向来自不同时区的用户显示日期(不带时间元素)。假设日期存储在某个服务器上的某个数据库中,该服务器运行在某个时区(例如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=问题。此类时间值表示历史中的特定日期。因为它没有时间元素,所以不能转移到不同的时区。似乎很容易将带有零时间组件的日期存储为2013-08-20 00:00 UTC,并将其显示给用户,而不使用时间组件。但在将这一点从时区UTC-x转换为2013-08-19之后,这是错误的,因为我们不知道历史上的这一点昨天在世界的哪个地方被考虑,今天仍然在哪里。事实上,地球上有三个不同的日期()

问题的一个很好的例子是发票的到期日。当您在UTC+6时区开具到期日为2013-08-20的发票并将其存储在UTC中的服务器上时,中国人何时应该付款?它是在基于UTC的服务器上发布的2013-08-19还是仍然是2013-08-20

拟订问题:

没有时间元素的日期应该如何存储和处理,才能为来自多个时区的客户提供服务(包括超过12小时的差异)?它应该被转移吗?它应该保持不变吗?您如何在项目中处理这种情况?

非常感谢您阅读到这一点。如有任何参考或想法,我们将不胜感激。我能找到的唯一相关资料是之前提到的维基文章,但老实说,我不确定我的问题是否有答案。大多数文章都与日期-时间转换有关,但这一部分在这一点上处理得很好


另外,应用服务器是用Java编写的,因此我将这个问题标记为Java相关,以鼓励Java特定的解决方案(如果有的话)。

首先,我很高兴看到您对此进行了一些思考!许多开发人员忽略了这些细节,根据您的应用程序需求,这些细节可能非常重要

在Java中,您应该使用库来解决这些问题。这将有助于你区分你所谈论的概念

  • 您确定的第一个概念在Joda Time中称为。当与时区相连时,它被称为一个时区

  • 乔达时代的第二个概念叫做a

  • 您还确定了该类型-我同意该类型可能无法满足您的特定需求

重要的是要认识到,
LocalDate
实际上不在任何时区。这不是瞬间的时间线。这只是日历上的一个位置。它映射到一个真实的时间点将取决于你如何解释它

正如邓肯在评论中指出的,很难直接告诉你应该做什么,因为不同的企业在这方面有不同的要求。但这里有一些不同的方法:

  • 您可以将
    LocalDate
    绑定到客户所在时区的一天结束时间,这意味着您公司的每个客户都有一个不同的时刻

  • 您可以将
    LocalDate
    绑定到公司时区的一天结束,这意味着每个客户都有一个不同的时刻

  • 您可以制定由UTC定义工作日的公司政策

您应该仔细考虑这些选项的实际含义。例如,由于您正在谈论发票到期日,您可能希望允许宽限期


最后一点-您应该始终确保您的代码不关心服务器的时区。您可以轻松地部署到具有特定时区的服务器,并且您不希望它破坏任何东西。明智地使用UTC或日期/时间/偏移类型将解决特定时间点的问题。但是由于
LocalDate
不是一个精确的时间点,因此必须小心地从应用程序逻辑中的某个时区获取它。不要只要求服务器“立即”并假设这是正确的区域。

我们当然可以建议您解决此问题的最佳方法,但我认为您必须决定在这种情况下希望发生什么。我们无法告诉您是否适合用户查看不同的日期。一旦您了解了需求,我们可以就如何实施解决方案提供建议。我想在很多情况下,最好的办法是避免只使用日期字段。即使在开具发票的情况下,也应在开具发票国家的到期日后第二天上午12点之前支付发票。