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

多时区应用程序的java日历、日期和时间管理,java,date,calendar,timezone,Java,Date,Calendar,Timezone,我正在设计一个调度web应用程序。 我希望用户在几个不同的时区和地区添加事件。挑战在于如何正确呈现这些事件 例如: 如果一个用户在EST时区,并且正在观看另一个用户在PST中添加的网络研讨会事件,我想将事件的实际PST时间转换为本地时间,以供查看。因此,如果一个事件被安排在太平洋标准时间下午2点,那么它应该显示为东部标准时间下午5点 我还希望注意,如果有数千个事件可能需要从实际事件时间转换为观众的本地时间,那么性能不会受到影响 感谢您的所有想法和评论。 TIA一般来说,安排未来活动是一个复杂的课

我正在设计一个调度web应用程序。 我希望用户在几个不同的时区和地区添加事件。挑战在于如何正确呈现这些事件

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

我还希望注意,如果有数千个事件可能需要从实际事件时间转换为观众的本地时间,那么性能不会受到影响

感谢您的所有想法和评论。
TIA

一般来说,安排未来活动是一个复杂的课题。您必须在计划内容的上下文中进行区分:

  • 事件是否发生在特定的宇宙瞬间?如果是,则应以UTC为单位记录事件时间

    例如,每24小时运行一次的任务将按UTC时间而不是本地时间安排。它可能会在当地的某个午夜启动,但随着更改生效,它可能会在当地时钟的23:00或01:00运行

  • 但是,如果事件是由人类安排的,则很可能是当地时间,因此您应该以这种方式进行记录

    例如,在东部时间08:00召开的会议将始终在当地时间召开。冬天是13:00 UTC,夏天是12:00 UTC

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

    相反,您应该存储两个值—本地时间,如
    08:00
    ,以及其IANA时区标识符,如
    America/New_York
    。您可能还需要存储重复模式或特定日期,具体取决于事件的计划方式

  • 考虑使用而不是Java的
    日历
    日期
    类。它将使你免于许多头痛。确保您阅读了Joda Time文档并了解其工作原理

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

  • 确保有一个定期检查的程序。随着世界各国政府对其时区的法律定义进行修改,每年都会发布多次更新。您不能只部署一次就忘记它

  • 另外,请确保您了解,由于以下原因,从本地时间到特定UTC时间的转换不是一个完美的功能。如果事件安排在无效或不明确的本地时间,您应该在应用程序中具有检测和处理该事件的策略。您可能只是应用一些假设,或者您可能想不厌其烦地询问用户该做什么

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

    另一个例子是,如果我将活动安排在东部时间每天凌晨1:00,那么在2013年11月3日,该时间会发生两次。事件是否应在第一个(白天)发生?还是在第二次(标准时间)的情况下?或者两者都有?我应该假设一个或另一个,或者我应该问用户他们的意思是什么

    只有您可以决定做什么,因为这是您的应用程序。但忽视这个问题可能会导致错误

  • 一旦事件通过,您可以根据需要在UTC中进行记录,或者使用完整的本地日期时间和偏移量进行记录。两者都可以接受。这只适用于单一的过去事件,而不适用于反复出现的未来事件


感谢您的详细回复。我预计几乎所有的事件都将由人类创造。我的想法是保存时区和毫秒,因此我知道事件的实际本地时间,并能够将其转换为查看器的时区。您是对的,这并不像看上去那么简单……如果您存储毫秒,例如从
Date.getTime()
,则将以UTC而不是本地时间为单位。如果时区规则在您的时间出现之前更改,则可能是错误的值。在世界上的一些地区,这些时区变化频繁发生,因此很难确保未来的本地时间与未来的UTC时间一致。(我确实说过这很复杂。:)您可能应该使用JodaTime中的
LocalDateTime
(和时区)。你把这些存储在什么数据库里?该死!关于UTC Matt,您是对的,但我的想法是,我将使用本地TZ和millis进行转换,这将为我提供本地时间。我正在使用MySQL。我以前没有使用过JopdaTime,但肯定会考虑这个解决方案。如果我存储事件创建者的本地日期时间和TZ,转换为查看器的日期时间时会遇到问题吗?那应该没问题,只需注意我描述的DST问题。