sco*_*ttb 8 java time timezone calendar gregorian-calendar
我有一个包含UTC(GMT + 0)时间戳的数据库.问题在于:它们指的是在印第安纳州发生的计费活动.
有些人可能知道,印第安纳......
由于此数据库中的时间戳是指政府计费活动,因此实际上有必要将UTC时间戳报告为历史上准确的本地时间,以便保持审计准确性.因此,有三种情况唯一适用于印第安纳州:2006年之前的时间戳使用与2006-2007之间的时区规则完全不同的时区规则,2007年之后的时间规则使用另一组完全不同的时区规则.您可以想象这个数据库包含除印第安纳州以外的语言环境的活动,因此事情变得更加复杂.
Java Calendar和TimeZone API不包含允许程序员创建具有多个时区规则集的对象的任何类,因此如果特定的适用时区,它们不能用于正确映射UTC时间戳到历史上准确的本地时间规则永远改变.
我已经考虑过如何通过改变时区规则来解决在语言环境中映射到历史上准确的本地时间的问题......
可以更新数据库,以便可以将UTC时间戳与本地时间偏移和夏令时偏移一起存储.这里的问题是数据库的大小增加了一点,如果现有数据库很大,那么更新所有表可能需要扩展的离线维护周期.
可以更新数据库,以便与每个时间戳一起存储适合于该特定时间戳的特定TimeZone对象.虽然我认为TimeZone对象非常轻量级,但我认为它比上面的更灵活,但仍然不太理想,因为它需要为每个时间戳保留一个对象.
可以开发一个自定义API,用于从感兴趣的语言环境的历史准确规则的数据库构建适当的TimeZone对象.该解决方案取代了前两种解决方案增加的存储需求,需要额外的处理.每个需要显示的时间戳都意味着创建一个新对象......或者至少与对象池中的适当对象配对.此外,它还意味着创建和管理时区数据库.
Java时间和日历API的局限性使得找到一个优雅的解决方案来解决这个问题真的比它应该更难(例如,您不能查询现有的SimpleTimeZone对象并询问它遵循什么夏令时规则而不写一些真是凌乱的代码).
我想问一下其他人是否曾经处理过这样的情况,以及他们是如何处理的.
小智 2
您所描述的时区数据库已经存在。它称为 Olson zoneinfo 数据库,对于 1970 年之后的所有日期都是正确的,并且可以在线获取。
更好的是,Java 的本机日期和时间 API 使用此数据库。您可以使用 加载任意时区java.util.TimeZone.getTimeZone(),并使用此对象获取偏移量或执行转换(例如,使用 )TimeZone.getOffset(long)。例如,您可以加载该"America/Indiana/Indianapolis"时区以转换印第安纳州的日期和时间。
使用数据库无法轻松完成的一件事TimeZone实际上是查询它正在使用的规则。为此,我相信您必须直接深入研究 tz 文件。但在大多数情况下,只需获取指定日期的偏移量就足够了。
| 归档时间: |
|
| 查看次数: |
748 次 |
| 最近记录: |