当前位置: 首页 > 知识库问答 >
问题:

为什么calendar.get(calendar.dst_offset)在夏令时期间给0?

范飞翰
2023-03-14

我有一个日历对象,对应于2021-07-05T18:000.000-04:00(东部夏时制)。但是calendar.get(DST_OFFSET)和calendar.getTimeZone().getDstSavings()都给出0。应该是1小时。我错过了什么,或者我出了什么问题?我使用的所有其他方法都返回期望值。

import java.util.Calendar;

public class C {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        System.out.printf("Offset: %d%n", c.get(Calendar.DST_OFFSET));
        System.out.printf("Savings: %d%n", c.getTimeZone().getDSTSavings());
    }
}

$ java -Duser.timezone=EDT C
Offset: 0
Savings: 0

共有1个答案

壤驷子安
2023-03-14

一个问题是输入定义了UTC的偏移量,而不是具有特定规则的实时时区(比如是否应用了DST,如果是,何时应用DST)。

Calendar显然不能处理这些规则,这个类(可能还有整个API)并不是这样设计的。

这就是Java8中引入Java.time的原因之一。

public static void main(String[] args) {
    // example String in ISO format
    String dateString = "2021-07-05T18:00:00.000-04:00";
    // define your time zone
    ZoneId americaNewYork = ZoneId.of("America/New_York");
    // parse the (zone-less) String and add the time zone
    ZonedDateTime odt = OffsetDateTime.parse(dateString)
                                      .atZoneSameInstant(americaNewYork);
    // then get the rules of that zone
    long hours = americaNewYork.getRules()
                               // then get the daylight savings of the datetime
                               .getDaylightSavings(odt.toInstant())
                               // and get the full hours of the dst offset
                               .toHoursPart();
    
    // use a formatter to format the output (nearly) as desired
    System.out.println(odt.format(DateTimeFormatter.ISO_ZONED_DATE_TIME)
                        + " has a daylight saving offset of "
                        + hours);
}
2021-07-05T18:00:00-04:00[America/New_York] has a daylight saving offset of 1
 类似资料:
  • 夏令时间 选择[标准]或[夏令时间]。

  • 问题内容: 为什么以下返回0? 问题答案: 月份从0(一月)到11(十二月)进行编号。 参考:

  • 轻触方格启用设定,即可将夏令时反映于时间显示中。

  • 问题内容: 不存在。当我将日期和时间设置为此值时,它不会失败。时间设置为一个小时后。如何通知我该时间不存在。这是时间飞逝的方式 如您所见,此日期将永远不存在。 这是我正在使用的代码 问题答案: 您的样本不会抛出异常,因为它会调整日期时间。该javadoc的状态 这将创建一个与输入的本地日期时间尽可能匹配的分区日期时间。夏时制等时区规则意味着,并非每个本地日期时间都对指定时区有效,因此可以调整本地日

  • 2018-03-26 09:04:14Z 2018-03-26 14:34:14+05:30 2018-03-26 11:04:14+02:00

  • 问题内容: 如何检查夏令时是否有效? 问题答案: 您可以使用并查看返回值中的标志。 使用,您可以在任意时间问相同的问题,以了解DST在当前时区是否有效。