日期时间joda api显示某些区域ID的区域代码不正确

时间:2015-01-09 04:05:04

标签: java datetime calendar timezone jodatime

我尝试使用格式化程序yyyy-MM-dd HH:mm z格式化日期时间,使用joda api格式化Australia/Yancowinna。我的期望是,它应该为区域显示3个字母的短代码(例如:IST,GMT,EDT等),而不是它显示+10:30。它如何为大多数其他ID显示正确的区域代码。

这是我的代码

package com.rais;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;

public class DateClient {

    public static void main(String[] args) {
        DateTimeZone.setDefault(DateTimeZone.forID("Australia/Yancowinna"));        
        DateTime datetime = new DateTime("2015-01-13T14:30:00.000+10:30");
        System.out.println("Original time = "+datetime);
        System.out.println("Original time zone = "+datetime.getZone());
        System.out.println("Original time toString(yyyy-MM-dd HH:mm z)= "+datetime.toString("yyyy-MM-dd HH:mm z"));   

    }
}

这是输出

Original time = 2015-01-13T14:30:00.000+10:30
Original time zone = Australia/Broken_Hill
Original time toString(yyyy-MM-dd HH:mm z)= 2015-01-13 14:30 +10:30

如果我们使用区域标识Asia/Amman,它会在Windows的情况下显示正确的区域代码,但在linux的情况下不显示区域代码。

1 个答案:

答案 0 :(得分:1)

Joda-Time Is Correct

对于DST IN +10:30Australia/Yancowinna的偏移确实是正确的。

将时区报告为Australia/Broken_Hill也是正确的。 That name is primaryAustralia/Yancowinna是次要的。

避免3& 4个字母代码

这些3或4个字母代码既不标准也不唯一。

IST是指爱尔兰标准时间还是印度标准时间?这只是一个例子。

此外,这些代码指的是标准时间和夏令时。这些不是时区,它们是应用时区的结果。时区是UTC(小时和分钟)的偏移量,用于过去,现在和将来的日期时间值所需的夏令时(DST)等异常的一组规则。

Joda-Time和java.time都明智地避免使用那些3/4字母代码。你也应该这样做。

这些库确实试图将这些代码解析为输入。但鉴于他们的问题,我建议避免这种进口。坚持使用ISO 8601标准格式字符串,默认情况下在Joda-Time和java.time中使用。除了偏移量之外,java.time库通过在括号中附加proper time zone name来扩展该标准格式。这是一种明智的方法,因为所有信息都包含在时区之间来回转换。