2

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
4

2 回答 2

2

我们应该询问 JDK 开发人员为什么他们决定 SimpleDateFormat 不应该支持时区 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)

于 2013-02-01T11:40:27.833 回答
2

如果您使用 Java 8,则可以使用新的日期和时间 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);
于 2015-06-23T08:04:05.160 回答