只是为了验证这一点:我有这种蹩脚的脑死亡方法来计算我当前位置的时区偏移量。我想知道是否需要在Day Light Saving时间问题时调整它(目前我的位置有冬季时间,CET时区,因此很难验证)。
// The local time zone's offset
private int getLocalOffset() {
DateTimeZone defaultZone = DateTimeZone.getDefault();
return defaultZone.getOffset(null) / 1000 / 60 / 60;
}
感谢任何提示。
答案 0 :(得分:8)
时区和夏令时是一场噩梦。你当然不应该自己承担这项任务。让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
,前导零。答案 1 :(得分:3)
通常情况下,Joda时间会自行处理DST,因此您不必担心。但是,我注意到您正在将null
传递给getOffset()。鉴于时区偏移取决于日期,你真的应该通过你计算偏移的日期/时间,否则你将得到错误的结果。
同样在我之前的评论中提到:请注意,某些时区的偏移量不是整数小时。例如印度格林威治标准时间+5:30
答案 2 :(得分:1)
是的,没关系。要验证它是否正确 - 而不是将DateTime
对象中的null传递传递给DateTimeZone.getOffset
- 将日期时间设置为夏天,当您知道DST生效时 - 您应该看到偏移值更改。