SimpleDateFormat在不同的时区JVM中表现不同

Kan*_*mar 6 java timezone date simpledateformat

我按照以下代码在指定的dateTime上使用指定的Timezone创建Date对象.
注意:我没有为jvm设置任何时区; 但是使用不同的Linux服务器时区测试此代码.

    String date = "20121225 10:00:00";
    String timeZoneId = "Asia/Calcutta";
    TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);

    DateFormat dateFormatLocal = new SimpleDateFormat("yyyyMMdd HH:mm:ss z");
                //This date object is given time and given timezone
    java.util.Date parsedDate = dateFormatLocal.parse(date + " "  
                     + timeZone.getDisplayName(false, TimeZone.SHORT));

    if (timeZone.inDaylightTime(parsedDate)) {
        // We need to re-parse because we don't know if the date
        // is DST until it is parsed...
        parsedDate = dateFormatLocal.parse(date + " "
                + timeZone.getDisplayName(true, TimeZone.SHORT));
    }
Run Code Online (Sandbox Code Playgroud)


现在parsedDate对象的行为不同
当我的jvm服务器在IST中运行时
parsedDate.getTime() - 1356409800000
parsedDate.toString() - Tue Dec 25 10:00:00 IST 2012
in GMT --- 12/25/2012 04: 30:00 GMT
当我的jvm服务器在EST运行时
parsedDate.getTime() - 1356422400000
parsedDate.toString() - Tue Dec 25 03:00:00 EST 2012
in GMT --- 12/25/2012 08:00 :00 GMT

我的两个系统时间是同步的
星期一12月24日10:30:04 EST 2012年
12月24日21:00:48 IST 2012
我期待在这两台机器上我应该得到相同的GMT时间.
这里有什么问题?

rua*_*akh 3

短名称不是识别时区的好方法,因为它不是唯一的;Javadocjava.util.TimeZone给出了“‘CST’可以是美国‘中部标准时间’和‘中国标准时间’”的示例。

更普遍 。。。与其将时区作为字符串传递,以便您必须解析它,不如通过使用您已有的实例告诉您时区是什么DateFormat更有意义:DateFormatTimeZone

    DateFormat dateFormatLocal = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
    dateFormatLocal.setTimeZone(timeZone);
    java.util.Date parsedDate = dateFormatLocal.parse(date);
Run Code Online (Sandbox Code Playgroud)

(这也将在可能的情况下自动处理夏令时。)