为什么java simpledateformat parse方法不支持timezone id

时间:2013-02-01 10:48:05

标签: java parsing simpledateformat

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

2 个答案:

答案 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);