我有一个日历对象,对应于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
一个问题是输入定义了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在当前时区是否有效。