java的SimpleDateFormat
parse
方法支持时区短名称,长名称和偏移量。
为什么不支持时区Id?
例如。
SimpleDateFormat sdf = new SimpleDateFormat("z");
sdf.parse("IST"); //works fine
SimpleDateFormat sdf = new SimpleDateFormat("z");
sdf.parse("Indian Standard Time"); //Also works fine
为什么java不支持这个:
SimpleDateFormat sdf = new SimpleDateFormat("z");
sdf.parse("Asia/Kolkata"); //does not work
答案 0 :(得分:2)
我们问JDK开发人员为什么他们认为SimpleDateFormat不支持timezone Id。此外,SimpleDateFormat API还不清楚它对'z'的期望格式。但我知道它支持什么。它根据DateFormatSymbols.getZoneStrings()返回的数据检查时区。它是一个时区阵列,每个时区都是一个字符串数组
•[0] - time zone ID
•[1] - long name of zone in standard time
•[2] - short name of zone in standard time
•[3] - long name of zone in daylight saving time
•[4] - short name of zone in daylight saving time
区域ID未本地化;其他是本地化的名称。有关详情,请参阅API。
我们可以将所有可用的时区视为
DateFormatSymbols dfs = DateFormatSymbols.getInstance();
for(String[] s : dfs.getZoneStrings()) {
System.out.println(Arrays.toString(s));
}
结果(取决于区域设置)
...
[Asia/Calcutta, India Standard Time, IST, India Daylight Time, IDT]
...
所以SimpleDateFormat(在我的语言环境中)允许印度标准时间,IST,印度夏令时或IDT为'z',但它不允许亚洲/加尔各答(时区ID)
答案 1 :(得分:2)
如果您使用Java 8,则可以使用新的Date和Time API。 " VV"表示时区ID。
请参阅https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html
示例:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm VV");
ZonedDateTime zonedDateTime = ZonedDateTime.parse("06/23/2015 21:00 US/Pacific", formatter);