org.joda.time |夏令时 (DST) 和本地时区偏移
Posted
技术标签:
【中文标题】org.joda.time |夏令时 (DST) 和本地时区偏移【英文标题】:org.joda.time | Day Light Saving time (DST) and local time zone offset 【发布时间】:2013-11-27 12:25:15 【问题描述】:只是为了验证这一点:我有这种跛脚和脑死的方法来计算我当前位置的时区偏移量。我想知道当夏令时遇到问题时我是否需要调整它(目前我们所在的位置是冬季时间,CET 时区,所以很难验证)。
// The local time zone's offset
private int getLocalOffset()
DateTimeZone defaultZone = DateTimeZone.getDefault();
return defaultZone.getOffset(null) / 1000 / 60 / 60;
感谢任何提示。
【问题讨论】:
您不应使用 int 以小时为单位来表示本地区域偏移量。许多地方实际上有半小时的偏移量(例如:印度)。你不能用你的int来表示。 joda time 用毫秒数表示它是有原因的。 这是个好主意。我差点忘了。 【参考方案1】:时区和夏令时是一场噩梦。你当然不应该自己承担这项任务。让 Joda-Time 完成繁重的工作。
请参阅this answer 以解决类似问题,Using Joda time to get UTC offset for a given date and timezone。 DateTimeZone 类提供了一个 getOffset() 方法。
Java 7 中 Joda-Time 2.3 中的示例源代码...
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
org.joda.time.DateTimeZone californiaTimeZone = org.joda.time.DateTimeZone.forID("America/Los_Angeles");
org.joda.time.DateTime now = new org.joda.time.DateTime(californiaTimeZone);
int millisecondOffsetToAddToUtcToGetLocalTime = californiaTimeZone.getOffset( now );
System.out.println( "millisecondOffsetToAddToUtcToGetLocalTime: " + millisecondOffsetToAddToUtcToGetLocalTime );
// Note the casting to doubles to avoid integer truncation. Time zone offsets are NOT always whole hours.
System.out.println( "Offset in decimal hours: " + (double)millisecondOffsetToAddToUtcToGetLocalTime / 1000d / 60d / 60d );
在 2013-11-20T01:03:56.464-08:00 运行时…
millisecondOffsetToAddToUtcToGetLocalTime: -28800000
millisecondOffsetToAddToUtcToGetLocalTime in hours: -8.0
重要提示对于偏移量,-8.0
的数字格式不正确。必须是:
-08:00
带有冒号和两位数(用前导零填充)。
-08
前导零。
【讨论】:
【参考方案2】:通常情况下,Joda 时间会自行处理 DST,因此您不必担心。但是,我注意到您将 null
传递给 getOffset()。鉴于时区偏移量取决于日期,您确实应该传递计算偏移量的日期/时间,否则您会得到错误的结果。
正如我之前的评论中提到的:请注意,某些时区的偏移量不是整数小时数。例如,印度是格林威治标准时间 +5:30
【讨论】:
【参考方案3】:是的,没关系。要验证它是否正确 - 而不是将 DateTime
对象中的 null 传递给 DateTimeZone.getOffset
- 将日期时间设置为夏季的某个时间,当您知道 DST 生效时 - 您应该会看到偏移值发生了变化。
【讨论】:
以上是关于org.joda.time |夏令时 (DST) 和本地时区偏移的主要内容,如果未能解决你的问题,请参考以下文章
如何从 org.joda.time.DateTime 转换为 java.time.ZonedDateTime
Cassandra.ServerErrorException:'java.lang.NoClassDefFoundError:org/joda/time/ReadablePartial'
java.lang.ClassNotFoundException: org.joda.time.ReadablePeriod