我正在设计一个安排网络应用程序。 我希望用户可以在几个不同的时区和区域设置中添加事件。挑战在于正确呈现这些事件。
所以,举个例子:
如果用户在EST时区并且正在查看由另一个用户在PST中添加的网络研讨会事件,我想将事件的实际PST时间转换为查看者的本地时间。因此,如果事件安排在太平洋标准时间下午2点,那么它应显示为美国东部标准时间下午5点。
我还要注意,如果有数千个事件可能需要从实际事件时间转换到观看者的当地时间,那么性能不会受到影响。
所有的想法和评论都表示赞赏 TIA
答案 0 :(得分:32)
通常,安排 future 事件是一个复杂的主题。您必须在将要安排的内容中进行区分:
事件是否在特定的通用时刻发生?如果是这样,您应该以UTC格式记录事件时间。
例如,每24小时运行一次的任务将按UTC时间安排,而不是按当地时间安排。它可能会在当地午夜开始,但随着daylight saving time更改生效,它可能会在当地时钟23:00或01:00运行。
但是,如果事件是由人类安排的,那么很可能是以当地时间为准,所以你应该这样记录。
例如,在美国东部时间08:00发生的会议将始终发生在本地时间。在冬天,那将是13:00 UTC,在夏天,它将在UTC UTC的12:00。
因此,在此上下文中,无法以UTC格式记录预定的开始时间。这是一个非常常见的错误,因为互联网上有大量建议“总是使用UTC存储”,这在这种情况下是错误的。
相反,您应该存储两个值 - 本地时间,例如08:00
及其IANA时区标识符,例如America/New_York
。您可能还需要存储重复发生模式或特定日期,具体取决于事件的计划方式。
考虑使用Joda Time而不是Java的Calendar
或Date
classess。它可以帮助您避免许多麻烦。请务必阅读Joda Time文档并了解其工作原理。
Joda Time拥有在一个时区与另一个时区之间进行转换所需的所有功能 - 我认为这是您问题的主要关注点。
请务必定期为updating time zone data制定程序。由于世界各国政府对其时区的法律定义进行了修改,因此每年都会多次推出更新。你不能只是部署它而忘记它。
另外请确保您了解由于daylight saving time,从本地时间到特定UTC时刻的转换不是完美的功能。如果在无效或模糊的本地时间内安排事件,您应该有一个策略来检测和处理应用程序中的事件。您可能只是应用一些假设,或者您可能想要不断询问用户该做什么。
例如,如果我每天在东部时间凌晨2:00安排活动,那么在2013年3月10日,该时间不存在。活动应该在凌晨3点发生吗?或者根本不应该发生?
另一个例子,如果我每天在美国东部时间凌晨1点安排一个活动,那么在2013年11月3日,那个时间两次。该事件应该在第一个(白天时间)实例发生吗?或者在第二个(标准时间)实例?或两者?我应该假设其中一个,还是应该询问用户他们的意思?
只有你可以决定做什么,因为这是你的应用程序。但忽略这个问题可能会导致错误。
一旦事件过去,您可以根据需要以UTC格式记录,或者使用完整的本地日期时间和偏移量进行记录。要么是可以接受的。这适用于单一的过去事件,而不是反复出现的未来事件。