SimpleDateFormat行为不一致

Edu*_*chi 7 java simpledateformat

请参阅以下代码:

String timeString = "1980-01-01T14:00:00+0300";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date date2 = sdf.parse(timeString);

// sdf.getCalendar().get(Calendar.ZONE_OFFSET);
System.out.println(sdf.format(date2));
Run Code Online (Sandbox Code Playgroud)

现在,我正处于一个+2h偏移,+1夏令时(目前)的国家.如果我按原样运行此代码,它将打印出来

1980-01-01T13:00:00+0200
Run Code Online (Sandbox Code Playgroud)

如果我取消注释询问日历偏移量的行,则程序的输出为

1980-01-01T14:00:00+0300
Run Code Online (Sandbox Code Playgroud)

知道为什么会发生这种情况,我怎样才能获得一致的输出?

为了避免任何不清楚的事情:因为我正在处理一些遗留代码,所以java 8不是一个选项.是的,这里的关键点是为什么,而不是解决方法是什么?有2个为什么:

  1. 为什么我通过+0300 TZ,默认情况下我会收到+0200?(除非另有说明,否则SimpleDateFormat应始终使用TimeZone.getDefault).
  2. 为什么它只是因为我在它的日历实例上调用getter来给出不同的答案.

mes*_*azs 2

问题是,这Calendar#get不是一个简单的 getter,它看起来像这样:

public int  get(int field)
{
    complete();
    return internalGet(field);
}
Run Code Online (Sandbox Code Playgroud)

complete根据 Javadoc,这是在哪里:

填写日历字段中任何未设置的字段。首先,computeTime()如果尚未根据日历字段值计算时间值(距纪元的毫秒偏移量),则调用该方法。然后,computeFields()调用该方法来计算所有日历字段值。

我在这里查找了源代码,但最新 Java 版本的代码也是相同的。