gpt4 book ai didi

java - 识别由于夏令时而重复的日期/时间

转载 作者:行者123 更新时间:2023-11-30 01:49:26 25 4
gpt4 key购买 nike

我正在尝试从字符串中解析日期。

我想确定由于夏令时而导致时钟倒转并且时间在同一天有效“重复”的情况。

例如,根据英国夏令时,时钟会在 2019 年 10 月 27 日凌晨 2 点倒退一小时。

因此:

  • 2019 年 10 月 27 日上午 12:30,
  • 一小时后 - 2019 年 10 月 27 日凌晨 1:30,
  • 一小时后 - 2019 年 10 月 27 日凌晨 1:30(截至凌晨 2 点,我们返回了一小时),
  • 一小时后 - 2019 年 10 月 27 日凌晨 2:30。

因此“1:30AM 27/10/2019”指的是两个不同的时间。这就是我试图确定的情况。

我创建了以下内容,但它使用 DateCalendar 类以及一些已弃用的方法。我想使用新的 java.time 功能来做到这一点 - 并且我希望有一个更简单的解决方案。

public static boolean isDateRepeatedDST(final Date date, TimeZone timeZone) {
if (timeZone == null) {
// If not specified, use system default
timeZone = TimeZone.getDefault();
}

if (timeZone.useDaylightTime()) {
// Initially, add the DST offset to supplied date
// Handling the case where this is the first occurrence
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MILLISECOND, timeZone.getDSTSavings());

// And determine if they are now logically equivalent
if (date.toLocaleString().equals(calendar.getTime().toLocaleString())) {
return true;
} else {
// Then try subtracting the DST offset
// Handling the second occurrence
calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MILLISECOND, -timeZone.getDSTSavings());

if (date.toLocaleString().equals(calendar.getTime().toLocaleString())) {
return true;
}
}
}

// Otherwise
return false;
}

最佳答案

    ZoneId zone = ZoneId.of("Europe/London");
ZonedDateTime dateTime = ZonedDateTime.of(2019, 10, 27, 0, 30, 0, 0, zone);
for (int i = 0; i < 4; i++) {
System.out.println(dateTime);
dateTime = dateTime.plusHours(1);
}

输出:

2019-10-27T00:30+01:00[Europe/London]
2019-10-27T01:30+01:00[Europe/London]
2019-10-27T01:30Z[Europe/London]
2019-10-27T02:30Z[Europe/London]

您可以看到时间 01:30 重复出现,并且两次出现的偏移量不同。

如果您想测试某个时间是否重复:

public static boolean isDateRepeatedDST(ZonedDateTime dateTime) {
return ! dateTime.withEarlierOffsetAtOverlap().equals(dateTime.withLaterOffsetAtOverlap());
}

如果我们修改 print 语句,我们可以在上面的循环中使用它:

        System.out.format("%-37s %s%n", dateTime, isDateRepeatedDST(dateTime));
2019-10-27T00:30+01:00[Europe/London] false
2019-10-27T01:30+01:00[Europe/London] true
2019-10-27T01:30Z[Europe/London] true
2019-10-27T02:30Z[Europe/London] false

关于java - 识别由于夏令时而重复的日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56579538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com