我有一个绘制时间序列图的GUI。用户通过在文本框中输入值来输入他们想要绘制的日期。例如,如果他们输入 25/07/13 22:00 和 26/07/13 00:00 ,则图表应输入来自的数据25日22:00:00至次日早晨00:00:59。用户输入的时间被解析为Calendar
对象。
我的问题来自DST。
用户不关心DST,所以他们想要看到的只是这两次之间的图表。但是,Calendar
对象确实关心DST,所以我的“到”日期当前不是00:00,而是01:00。 (我在伦敦,我们目前是格林尼治标准时间+ 1小时的夏令时)。
我想有效地忽略DST,并且当我想要绘制图形时,就好像所有内容都是GMT + 0一样。
我该怎么做?
答案 0 :(得分:5)
感谢你们的答案,他们帮我解决了问题。这有点归结为我使用Calendar
对象,用于数据的表示和存储,以及epoch
用于时间计算。
事实证明,Calendar
set()
方法会考虑DST。因此,当我在用户输入的文本框中解析时间值,并对每个set()
字段使用Calendar
时,Calendar
对象将知道,基于历史数据,您刚刚设置的日期是否已应用DST。因此,它理解你的意思,例如,GMT + 1,即使你没有意识到它(因为,坦率地说,谁做了?!)。
但,当您执行getTimeInMillis()
时,返回的epoch
没有时区或DST的概念,因此要与当前时区匹配,您必须应用DST如果适用,请手动返回到返回的epoch
。相反,当您在setTimeInMillis()
对象上使用Calendar
时,假设您输入的时间是GMT + 0,但,如果epoch
是日期当前已应用DST,Calendar
对象会为您添加它,这意味着您距离您认为的位置+1小时。要解决此问题,您需要在epoch
之前再次从D {{1}}中减去DST,然后再在日历中进行设置。
所有这些混乱在日间界限上尤其重要,特别是如果你像我一样使用日期分辨率。
答案 1 :(得分:1)
TimeZone tz = TimeZone.getTimeZone("Etc/GMT0");
DateFormat df = DateFormat.getDateTimeInstance();
df.setTimeZone(tz);
System.out.println(df.format(new Date()));
答案 2 :(得分:1)
如果我理解正确,您需要解析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);
答案 3 :(得分:1)
Calendar calendar = Calendar.getInstance();
calendar.set(calendar.DST_OFFSET, 0);