用于多时区应用程序的 java 日历、日期和时间管理

标签 java date calendar timezone

我正在设计一个日程安排网络应用程序。 我希望用户在几个不同的时区和语言环境中添加事件。挑战在于正确呈现这些事件。

举个例子:
如果用户处于 EST 时区并且正在查看由另一个用户在 PST 中添加的网络研讨会事件,我想将事件的实际 PST 时间转换为本地时间以供查看者使用。因此,如果事件安排在太平洋标准时间下午 2 点,那么它应该显示为美国东部标准时间下午 5 点。

我还想注意,如果有数千个事件可能需要将实际事件时间转换为查看者的本地时间,那么性能不会受到影响。

感谢所有想法和评论。
时间差

最佳答案

一般来说,安排 future 事件是一个复杂的主题。您必须区分要安排的内容:

  • 事件是否发生在特定通用时间?如果是这样,您应该根据 UTC 记录事件时间。

    例如,每 24 小时运行一次的任务将按 UTC 时间安排,而不是按本地时间安排。它可能会在本地某个午夜开始,但作为 daylight saving time更改生效,它可能会在本地时钟的 23:00 或 01:00 运行。

  • 但是,如果事件是人为安排的,则很可能是本地时间,因此您应该这样记录。

    例如,在东部时间 08:00 举行的 session 将始终在本地时间 举行。冬天是世界标准时间 13:00,夏天是世界标准时间 12:00。

    因此在这种情况下,您不能按照 UTC 记录计划的开始时间。这是一个非常常见的错误,因为 Internet 上有大量建议说“始终使用 UTC 存储”,在这种情况下这是错误的。

    相反,您应该存储两个值 - 本地时间,例如 08:00 及其 IANA 时区标识符,例如 America/New_York。根据事件的安排方式,您可能还需要存储重复模式或特定日期。

  • 考虑使用 Joda Time而不是 Java 的 CalendarDate 类。它将使您免于许多头痛。请务必阅读 Joda Time 文档并了解其工作原理。

    Joda Time 具有在一个时区和另一个时区之间转换所需的所有功能 - 我认为这是您问题的主要关注点。

  • 请务必为 updating 制定适当的程序time zone data经常。随着世界各国政府对其时区的法律定义进行更改,每年都会推出多次更新。您不能只部署一次就忘记它。

  • 另外请务必了解,由于 daylight saving time,从本地时间到特定 UTC 时刻的转换并不是一个完美的函数。 .如果在无效或不明确的本地时间安排了一个事件,您应该在应用程序中有一个检测和处理该事件的策略。您可能只是应用一些假设,或者您可能想特意询问用户要做什么。

    例如,如果我在东部时间每天凌晨 2:00 安排一个 Activity ,那么 2013 年 3 月 10 日,该时间不存在。事件应该在凌晨 3:00 发生吗?还是根本不应该发生?

    另一个例子,如果我在东部时间每天凌晨 1:00 安排一个 Activity ,那么在 2013 年 11 月 3 日,该时间会出现两次。事件应该在第一个(白天)实例发生吗?还是在第二个(标准时间)实例?或两者?我应该假设其中之一,还是应该询问用户他们的意思?

    只有您可以决定要做什么,因为这是您的申请。但是忽略这个问题可能会导致错误。

  • 事件过去后,您可以根据需要以 UTC 格式记录它,或者使用完整的本地日期时间和偏移量记录它。两者都可以接受。这适用于单一的过去事件,但不适用于 future 重复发生的事件。

关于用于多时区应用程序的 java 日历、日期和时间管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19166995/

相关文章:

javascript - 使用 Java 进行 Web 套接字映射

xml - XPath 3.0将日期差异与持续时间文字进行比较

javascript - 保存购买日期并添加 X 时间

java - 在命令行 java 中突出显示文本

java - HashMap 对于不同的键是线程安全的吗?

java - 如何在JHipster中为FeignClient启用Autowired?

java - 获取 I/art : Explicit concurrent mark sweep GC freed

python - 将字符串列表中的元素和下一个元素转换为 python 中的日期

javascript - 将一个类附加到给定数据的 javascript 日历 (clndr.js)

javascript - 在 CalendarDateInterval 控件中突出显示开始日期