使用Java日历时忽略DST

时间:2013-07-25 10:05:15

标签: java calendar dst

我有一个绘制时间序列图的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一样。

我该怎么做?

4 个答案:

答案 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);