使用 Timezone.getTimeZone (“南极洲/凯西”),某些时区将返回无效输出。例如
SimpleDateFormat outputFormat = new SimpleDateFormat( "MM/dd/yyyy hh:mm aa zzz" );
outputFormat.setTimeZone( TimeZone.getTimeZone( "Antarctica/Casey" ) );
System.out.println(outputFormat.format( new Date() ));
假设返回“MM / dd / yyyy hh:mm aa CAST ”,但返回“MM / dd / yyyy hh:mm aa WST ”。
像这样,这里还有其他一些问题,
最佳答案
如果您检查the IANA Time Zone Database,则会看到Casey当前位于WST时区,并且自2012年2月以来一直存在。
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone Antarctica/Casey 0 - zzz 1969
8:00 - WST 2009 Oct 18 2:00
# Western (Aus) Standard Time
11:00 - CAST 2010 Mar 5 2:00
# Casey Time
8:00 - WST 2011 Oct 28 2:00
11:00 - CAST 2012 Feb 21 17:00u
8:00 - WST
这是对该更改的更详细参考:http://www.timeanddate.com/news/time/antarctica-2012.html。
但是,仅在打印时使用WST:从内部正确地处理了从GMT + 8到GMT + 11的更改。参见例如:
public static void main(String[] args) {
SimpleDateFormat outputFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm aa Z");
TimeZone tz = TimeZone.getTimeZone("Antarctica/Casey");
outputFormat.setTimeZone(tz);
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
//May 2014 = GMT + 8
System.out.println(outputFormat.format(c.getTime()));
//january 2012 = GMT + 11
c.set(Calendar.YEAR, 2012);
c.set(Calendar.MONTH, 0);
System.out.println(outputFormat.format(c.getTime()));
}
至于其他差异,可能是夏季和冬季之间的差异。