使用Java日历时忽略DST

我有一个绘制时间序列图的GUI。 用户通过在文本框中输入值来输入他们想要绘制的日期。 例如,如果他们输入25/07/13 22:0026/07/13 00:00 ,图表绘制从25日22:00:00到次日早晨00:00:59的数据。 用户输入的时间被解析为Calendar对象。

我的问题来自DST。

用户不关心DST,因此他们想要看到的只是这两次之间的图表。 但是, Calendar对象确实关心DST,因此我的“to”日期当前不是00:00,而是01:00。 (我在伦敦,我们目前是格林威治标准时间+ 1小时的夏令时)。

我想有效地忽略DST,并且当我想绘制图形时,好像一切都是GMT + 0。

我怎样才能做到这一点?

谢谢你们的答案,他们帮我解决了问题。 它归结为我使用Calendar对象,数据的呈现和存储,以及时间计算的epoch

事实certificate, Calendar set()方法将考虑到DST。 因此,当我在用户输入的文本框中解析时间值,并对每个单独的Calendar字段使用set()Calendar对象将根据历史数据知道您刚刚设置的日期是否具有DST应用。 因此,它理解你的意思,例如,GMT + 1,即使你没有意识到它(因为,坦率地说,谁做了什么?!)。

但是 ,当你执行getTimeInMillis() ,返回的epoch没有时区或DST的概念,因此要匹配当前时区,您必须手动将DST应用于返回的epoch (如果适用)。 相反,当您在Calendar对象上使用setTimeInMillis()时,假设您输入的时间是GMT + 0, 如果epoch是当前已应用DST的日期,则Calendar对象将为您添加它,这意味着你距你原来的+1小时。 要解决此问题,您需要在设置日历之前从epoch再次减去DST(如有必要)。

所有这些混乱在日间界限上尤其重要,特别是如果你像我一样使用日期分辨率。

如果我理解正确,你需要解析25/07/13 22:00作为GMT日期/时间:

  SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm"); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); Date date = sdf.parse("25/07/13 22:00"); 

并根据此日期制作日历

  Calendar c= Calendar.getInstance(); c.setTime(date); 
  TimeZone tz = TimeZone.getTimeZone("Etc/GMT0"); DateFormat df = DateFormat.getDateTimeInstance(); df.setTimeZone(tz); System.out.println(df.format(new Date())); 
 Calendar calendar = Calendar.getInstance(); calendar.set(calendar.DST_OFFSET, 0);