2
|
android developer · 技术社区 · 7 年前 |
![]() |
1
4
这可能是因为JVM的默认时区是夏令时(DST)。 要获得正确的偏移量,应检查时区是否在DST中,并将其添加到偏移量中:
创建
实际上,你不需要
或者,甚至更短,使用
不确定其中是否有加载时区数据的,这取决于您的测试。
和
我想
常数
最终解决方案
假设默认时区在以色列(
|
![]() |
2
0
carlBjqsd的答案是可以的,只是有些尴尬,也许应该更清楚一点。 为什么相差一小时参见@carlBjqsd的最终解决方案:它使用表达式
而不是
这造成了你观察到的一个小时的差异。应用程序通常不需要仅使用原始偏移量进行计算,而原始偏移量不包括一年中某些时段的dst偏移量。 在从本地时间戳到UTC的任何转换中,只有总偏移量才起作用。 对原始偏移量或dst偏移量等部分偏移量进行细粒度区分的主要目的是正确命名区域(我们是否应称之为标准时间?)。 误导性问题标题:“无装载区”不 ,如果要使用区域在本地时间戳和UTC之间进行转换,则无法避免加载区域。你真正的问题是: 如何避免加载ThreetenABP的区域,并使用/加载Android平台的区域。 你的动机似乎是:
嗯,我还没有衡量哪个分区数据对性能的影响更大。根据我对相关库源代码的研究和知识,我只能说
如果只应使用一个区域,则使用单独区域文件的传统方法可能更好,但一旦您希望迭代所有可用区域,则最好只使用一个区域文件。 就我个人而言,我认为性能方面是可以忽略的。如果您使用Android zones,那么不可避免地会有一些加载时间。 如果您真的想加快ThreetenABP的初始化时间,您应该考虑在后台线程中加载它。 Android zones和ThreetenABP zones是否等效?通常不会。两个时区存储库可能会为具体区域提供相同的偏移量。他们经常这样做,但有时会有不受你控制的差异。 虽然两个时区存储库都使用 iana.org/tz 最终,差异主要是由tzdb数据的可能不同版本引起的。 您无法控制Android平台上存在哪个版本的区域数据,因为这取决于手机用户更新Android操作系统的频率。ThreetenABP的数据也是如此。你可以提供最新版本的应用程序,包括最新版本的ThreetenABP,但你无法控制移动设备用户是否真的更新了应用程序。 为什么要关心选择合适的tz存储库的其他原因?除了性能和初始化时间之外,还有一个特别的场景可能会让您感兴趣。如果Android操作系统有些陈旧,并且使用了过时的分区规则,那么一些手机用户不会更新操作系统,而是操纵设备时钟来补偿错误的时区数据。这样,他们仍然可以通过手机(在所有应用程序中)获得正确的当地时间。 在这种情况下,ThreetenABP并不能提供一个好的解决方案,因为将正确的区域数据与错误的设备时钟相结合将导致错误的本地时间戳(让用户感到恼火)。这是一个问题,例如不久前土耳其改变了dst规则。
仅使用Android的旧日历和时区API(在包中
我们可以说,为什么要费事,因为用户对设备配置做了“胡说八道”,但我们也生活在现实世界中,应该考虑如何让这些用户感到高兴。因此,在考虑一个解决方案时,我至少在日历库中介绍了这个解决方案 Time4A 方法,如 SystemClock.inPlatformView() 它使用(可能)最实际的区域数据,并基于以下假设获得正确的UTC时钟:用户将至少遵守正确的本地设备时间(无论他/她为实现此目标做了什么,通过更新操作系统或时钟/区域配置)。我很高兴以这种方式完全避免了旧的日历和区域API。我的API甚至允许同时使用两个区域存储库:
也许您可以从这些想法中获益,什么时候可以找到/开发适合您使用ThreetenABP的助手类。Time4A是开源的。 |
![]() |
Abhilash Das · 输入文本时,编辑文本与工具栏重叠 1 年前 |
![]() |
Community wiki · 局部变量可能尚未初始化 1 年前 |
![]() |
jvargas · 如何获取上个月的第一天和最后一天以及一年的第一天 2 年前 |