我尝试使用格式化程序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的情况下不显示区域代码。
答案 0 :(得分:1)
对于DST IN +10:30
,Australia/Yancowinna
的偏移确实是正确的。
将时区报告为Australia/Broken_Hill
也是正确的。 That name is primary,Australia/Yancowinna
是次要的。
这些3或4个字母代码既不标准也不唯一。
IST
是指爱尔兰标准时间还是印度标准时间?这只是一个例子。
此外,这些代码指的是标准时间和夏令时。这些不是时区,它们是应用时区的结果。时区是UTC(小时和分钟)和的偏移量,用于过去,现在和将来的日期时间值所需的夏令时(DST)等异常的一组规则。
Joda-Time和java.time都明智地避免使用那些3/4字母代码。你也应该这样做。
这些库确实试图将这些代码解析为输入。但鉴于他们的问题,我建议避免这种进口。坚持使用ISO 8601标准格式字符串,默认情况下在Joda-Time和java.time中使用。除了偏移量之外,java.time库通过在括号中附加proper time zone name来扩展该标准格式。这是一种明智的方法,因为所有信息都包含在时区之间来回转换。