3

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

我的问题来自夏令时。

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

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

我怎样才能做到这一点?

4

4 回答 4

6

感谢大家的回答,他们帮助我解决了这个问题。这有点归结为这样一个事实,即我使用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要解决此问题,您需要在日历中设置之前再次减去 DST(如有必要) 。

所有这些混淆在日期边界上都特别重要,尤其是当你像我一样将日期分辨率用于任何事情时。

于 2013-07-25T15:07:02.403 回答
4
Calendar calendar = Calendar.getInstance();
calendar.set(calendar.DST_OFFSET, 0); 
于 2017-11-16T13:27:50.703 回答
1
    TimeZone tz = TimeZone.getTimeZone("Etc/GMT0");
    DateFormat df = DateFormat.getDateTimeInstance();
    df.setTimeZone(tz);
    System.out.println(df.format(new Date()));
于 2013-07-25T10:23:58.387 回答
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);
于 2013-07-25T10:33:11.517 回答