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

use*_*571 12 java timezone calendar date

我正在设计一个调度Web应用程序.我希望用户可以在几个不同的时区和区域设置中添加事件.挑战是正确呈现这些事件.

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

我还要小心,如果有数千个事件可能需要从实际事件时间转换到查看者的本地时间,性能不会受到影响.

所有的想法和意见都表示赞赏.
TIA

Mat*_*int 35

通常,安排未来事件是一个复杂的主题.您必须在将要安排的内容中进行区分:

  • 事件是否在特定的通用时刻发生?如果是这样,您应该以UTC的形式记录事件时间.

    例如,每24小时运行一次的任务将按UTC时间安排,而不是按当地时间安排.它可能会在当地午夜开始,但随着夏令时变化生效,它可能会在当地时钟23:00或01:00运行.

  • 但是,如果事件是由人类安排的,那么很可能是当地时间,所以你应该这样记录.

    例如,在东部时间08:00发生的会议将始终在当地时间发生.在冬天,那将是13:00 UTC,在夏天,它将在UTC UTC的12:00.

    因此,在此上下文中,您无法以UTC的形式记录计划的开始时间.这是一个非常常见的错误,因为互联网上有大量的建议说"总是使用UTC存储",这在这种情况下是错误的.

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

  • 考虑使用Joda Time而不是Java CalendarDateclassess.它可以帮助您避免许多麻烦.请务必阅读Joda Time文档并了解其工作原理.

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

  • 确保有一个适当的程序更新时区数据定期.由于世界各国政府对其时区的法律定义进行了修改,因此每年都会多次推出更新.你不能只是部署它而忘记它.

  • 另外请确保您了解由于夏令时,从本地时间到特定UTC时刻的转换不是完美的功能.如果在无效或模糊的本地时间内安排事件,您应该有一个策略来检测和处理应用程序中的事件.您可能只是应用一些假设,或者您可能想要不断询问用户该做什么.

    例如,如果我每天在东部时间凌晨2:00安排一个活动,那么在2013年3月10日,该时间不存在.活动应该在凌晨3点发生吗?或者根本不应该发生?

    另一个例子,如果我每天在美国东部时间凌晨1点安排一个事件,那么在2013年11月3日,那个时间会发生两次.该事件应该在第一个(白天时间)实例发生吗?或者在第二个(标准时间)实例?或两者?我应该假设一个或另一个,或者我应该问用户他们的意思?

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

  • 事件一旦过去,您可以根据需要以UTC格式记录,或者使用完整的本地日期时间和偏移量进行记录.要么是可以接受的.这适用于单一的过去事件,只是不适用于反复出现的事件.