【问题标题】:Ignoring DST when using Java Calendars使用 Java 日历时忽略 DST
【发布时间】:2013-07-25 03:55:56
【问题描述】:

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

我的问题来自夏令时。

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

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

我该怎么做?

【问题讨论】:

    标签: java calendar dst


    【解决方案1】:

    感谢大家的回答,他们帮助我解决了这个问题。归根结底,我使用Calendar 对象来表示和存储数据,并使用epoch 来进行时间计算。

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

    然而,当你做getTimeInMillis()时,返回的epoch没有时区或DST的概念,所以要与当前时区匹配你必须手动将DST应用于返回epoch,如果适用的话。相反,当您在 Calendar 对象上使用 setTimeInMillis() 时,假定您输入的时间是 GMT+0,但是如果 epoch 是当前应用 DST 的日期, Calendar 对象将为您添加它,这意味着您距离您认为的位置 +1 小时。要解决此问题,您需要在将其设置到日历之前,从epoch 中再次减去 DST。

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

    【讨论】:

    • 有趣的是,当时钟发生变化时,我倾向于为这个答案投票! :-)
    【解决方案2】:
    Calendar calendar = Calendar.getInstance();
    calendar.set(calendar.DST_OFFSET, 0); 
    

    【讨论】:

      【解决方案3】:

      如果我理解正确,您需要将 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);
      

      【讨论】:

        【解决方案4】:
            TimeZone tz = TimeZone.getTimeZone("Etc/GMT0");
            DateFormat df = DateFormat.getDateTimeInstance();
            df.setTimeZone(tz);
            System.out.println(df.format(new Date()));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-02
          • 1970-01-01
          • 2011-10-31
          • 2018-03-12
          • 1970-01-01
          • 2018-12-17
          • 2018-04-14
          相关资源
          最近更新 更多