当前位置: 首页 > 面试题库 >

如何在夏令时之内验证本地日期时间?

董飞航
2023-03-14
问题内容

Mar 12, 2017 02:39:00 "America/Chicago"不存在。当我将日期和时间设置为此值时,它不会失败。时间设置为Mar 12, 2017 03:39:00一个小时后。如何通知我该时间不存在。这是时间飞逝的方式

01:59:59
3:00:00

如您所见02:39:00,此日期将永远不存在。

这是我正在使用的代码

package com.company;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;

public class Main {

    public static void main(String[] args) {
        ZoneId zoneId = ZoneId.of("America/Chicago");
        ZonedDateTime dateTimeStart = ZonedDateTime.of(2017, 1, 1, 15, 39, 0, 0, ZoneId.of("America/Chicago"));
        ZonedDateTime dateTimeStartUtc = dateTimeStart.withZoneSameInstant(ZoneOffset.UTC);

        ZoneId zoneIdDst = ZoneId.of("America/Chicago");
        ZonedDateTime dateTimeStartDst = ZonedDateTime.of(2017, 3, 12, 2, 39, 0, 0, ZoneId.of("America/Chicago"));
        ZonedDateTime dateTimeStartUtcDst = dateTimeStart.withZoneSameInstant(ZoneOffset.UTC);
        int y = 90;
    }
}

问题答案:

您的样本不会抛出异常,因为它会ZonedDateTime.of(..)调整日期时间。该javadoc的状态

这将创建一个与输入的本地日期时间尽可能匹配的分区日期时间。夏时制等时区规则意味着,并非每个本地日期时间都对指定时区有效,因此可以调整本地日期时间。

您可以ZonedDateTime#ofStrict(LocalDateTime, ZoneOffset, ZoneId)用来执行验证。

获取ZonedDateTime的实例,该实例严格验证本地日期时间,偏移量和区域ID的组合。

这将创建一个分区日期时间,以确保偏移量根据指定区域的规则对本地日期时间有效。如果偏移量无效,则会引发异常。

您首先需要构造一个LocalDateTime。然后你会得到ZoneOffsetZoneId为本地日期时间。然后,您可以将这三个都提供给ofStrict

例如,

ZoneId zoneId = ZoneId.of("America/Chicago");
LocalDateTime ldt = LocalDateTime.of(2017, 3, 12, 2, 39, 0, 0);
ZoneOffset zoneOffset = zoneId.getRules().getOffset(ldt);
ZonedDateTime zdt = ZonedDateTime.ofStrict(ldt, zoneOffset, zoneId);

会抛出

Exception in thread "main" java.time.DateTimeException: LocalDateTime '2017-03-12T02:39' does not exist in zone 'America/Chicago' due to a gap in the local time-line, typically caused by daylight savings
    at java.time.ZonedDateTime.ofStrict(ZonedDateTime.java:484)


 类似资料:
  • 我将事件存储在我的数据库中。我有“开始”和“结束”日期时间、“tickets_start”和“tickets_end”(用于门票销售实际开始/结束的时间,而不是实际事件的开始/结束)。 到目前为止,我已经构建了一些方法来完成所有有趣的事情,比如在保存之前将日期/时间转换为GMT,然后返回到各自的时区进行显示。 我将时区存储在具有“America/New_York”等值的varchar字段中。 但是

  • 我们从外部来源发送两个日期作为字符串。然后我们计算日期之间的差异,看看它们工作了多少小时。 由于时间的变化,一年两次——我们的计算会出错。我们使用Java。你怎么解决这样的问题? 这两个日期以字符串形式出现在一个文件中,格式如下。“2019-10-07上午11:07”

  • 问题内容: 只是为了验证这一点:我有这种la脚和脑死法,可以计算当前位置的时区偏移量。我想知道是否在需要调整“夏令时”时需要进行调整(目前,我所在的位置为CET时区,所以是“冬季时间”,因此很难验证)。 感谢您的任何提示。 问题答案: 通常,Joda时间会自己照顾DST,因此您不必担心。但是,我注意到您正在传递给getOffset()。鉴于时区偏移量取决于日期,因此您确实应该传递计算偏移量的日期/

  • 问题内容: 我想知道用Java最简单的方法来获取将来的夏令时将改变的日期列表。 一种相当灵活的方法是简单地迭代一整年的时间,然后对它们进行TimeZone.inDaylightTime()测试。这将起作用,并且我不担心效率,因为这仅在我的应用每次启动时都需要运行,但是我想知道是否有更简单的方法。 如果您想知道为什么要这样做,那是因为我有一个javascript应用程序,该应用程序需要处理包含UTC

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

  • 夏令时间 选择[标准]或[夏令时间]。