【发布时间】:2018-01-09 19:26:49
【问题描述】:
在排除故障时,此方法行为中出现了一些奇怪的现象。
上下文
一些国家通过改变时间来节省一些日光。例如,在“欧洲/巴黎”时区,每年 3 月底的时间提前 1 小时,10 月底的时间提前 1 小时,时间都是在凌晨 2 点到凌晨 3 点之间。例如,这会导致 2016 年 10 月 30 日凌晨 02:15 的日期存在两次。
幸运的是,两个日期的时间戳(毫秒)数量不同,也没有可读的表示:
- 时移之前:2016 年 10 月 30 日星期日 02:15:00 CEST(UTC +0200)
- 时移后:2016 年 10 月 30 日星期日 02:15:00 CET(UTC +0100)
问题
在巴黎时区(使用SimpleDateFormat)实例化GregorianCalendar 对象后,我们得到了02:15 AM,然后按预期向后移动。
但如果我们想使用.set() 为这个对象设置分钟,+0200 偏移信息会损坏为 +0100(“相同时间”,但在时间偏移之后)
有没有办法这样做,因为方法.add()实际上保留了偏移信息?
示例
// Instantiation
GregorianCalendar gc1 = new GregorianCalendar(TimeZone.getTimeZone("Europe/Paris"));
gc1.setTime(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss Z").parse("2016-10-30 02:15:00 +0200"));
GregorianCalendar gc2 = (GregorianCalendar) gc1.clone();
System.out.println(gc1.getTime()); // Output : Sun Oct 30 02:15:00 CEST 2016 ; OK
System.out.println(gc2.getTime()); // Output : Sun Oct 30 02:15:00 CEST 2016 ; OK
// Set/add minutes
gc1.set(Calendar.MINUTE, 10);
gc2.add(Calendar.MINUTE, 10);
System.out.println(gc1.getTime()); // Output : Sun Oct 30 02:10:00 CET 2016 ; Unexpected
System.out.println(gc2.getTime()); // Output : Sun Oct 30 02:25:00 CEST 2016 ; OK
【问题讨论】:
标签: java datetime timezone-offset gregorian-calendar