5

只是为了验证这一点:我有这种跛脚和脑死亡的方法来计算我当前位置的时区偏移量。我想知道当夏令时出现问题时我是否需要调整它(目前我们在我的位置有冬季时间,CET 时区,所以很难验证)。

// The local time zone's offset
private  int getLocalOffset() {
    DateTimeZone defaultZone = DateTimeZone.getDefault();
    return defaultZone.getOffset(null) / 1000 / 60 / 60;
}

感谢您的任何提示。

4

3 回答 3

8

时区和夏令时是一场噩梦。你当然不应该自己承担这项任务。让 Joda-Time 完成繁重的工作。

请参阅类似问题的答案Using Joda time to get UTC offset for a given date and timezoneDateTimeZone类提供了一个getOffset()方法。

Java 7 中 Joda-Time 2.3 中的示例源代码...</p>

// © 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 运行时…</p>

millisecondOffsetToAddToUtcToGetLocalTime: -28800000
millisecondOffsetToAddToUtcToGetLocalTime in hours: -8.0

重要信息对于偏移量,该数字格式-8.0不正确。必须是:

  • -08:00用冒号和两位数(用前导零填充)。
  • -08与前导零。
于 2013-11-20T08:56:18.630 回答
3

通常情况下,Joda time 会自己处理 DST,因此您不必担心。但是,我注意到您正在传递null给 getOffset()。鉴于时区偏移量取决于日期,您确实应该传递计算偏移量的日期/时间,否则您将得到错误的结果。

也正如我之前的评论中提到的:请注意,某些时区的偏移量不是整数小时。例如,印度是格林威治标准时间 +5:30

于 2013-11-14T13:31:47.473 回答
1

是的,没关系。要验证它是否正确 - 而不是在DateTime对象中传递 null 传递DateTimeZone.getOffset- 将日期时间设置为夏季的某个时间,当您知道 DST 有效时 - 您应该看到偏移值发生了变化。

于 2013-11-14T13:31:10.810 回答