我正在尝试了解时间处理,我偶然发现了 Java 中的一些东西,这让我有些困惑。拿这个示例代码:
public static void main(String[] args)
{
//Calendar set to 12:00 AM of the current day (Eastern Daylight Time)
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-4"));
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
/////
//Calendar set to 12:00 AM of the current day (UTC time)
Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
utcCal.set(Calendar.HOUR_OF_DAY, 0);
utcCal.set(Calendar.MINUTE, 0);
utcCal.set(Calendar.SECOND, 0);
utcCal.set(Calendar.MILLISECOND, 0);
/////
long oneHourMilliseconds = 3600000;
System.out.println((cal.getTimeInMillis() - utcCal.getTimeInMillis()) / oneHourMilliseconds);
}
我将计算时间的算法可视化为cal
两种形式中的一种:
- 计算从Epoch开始的毫秒数,加上offset(加-4)
- 从 (Epoch + offset) 计算毫秒数。所以从 (
Epoch - 4 * oneHourMilliseconds
) 开始的毫秒数。
这两种算法都应该产生比 4 小时后的结果utcCal
,但是运行代码会返回4
。
有人可以向我解释为什么cal
尽管设置为比 utcCal 晚 4 小时的时区,但最终在utcCalutcCal
后 4 小时获得毫秒值?代码不应该返回吗?-4