当输入日期处于从PDT到PST的过渡期时,如何处理日期?

我正在调用一个以两个日期为输入的API.API检查两个日期之间的差是否大于60分钟,然后引发异常。我的输入日期是startDate =

11-06-2016T00:57:01和endDate =

11-06-2016T01:56:01。这两个日期保存在java.util.Date对象中。现在的问题是,尽管两个日期相差59分钟(不到60分钟),但API仍会引发异常。类似的问题是由于DayLightSaving.11月6日,一旦凌晨2点,DayLightSaving结束(PDT时区结束),时间会向后移动1小时,因此时间现在又变为凌晨1点,但现在是PST时区。这意味着在11月6日,太平洋夏令时间将是凌晨1-2点,两次是PDT,一次是PST时区。在11月7日调用此API时,时区为PST。因此,如果在未指定时区的情况下传递了两个日期,由于PDT和PST本身相差1小时,因此这会相差59分钟,并且会引发异常。当输入日期处于从PDT到PST的过渡期时,该如何处理?

样例代码

SimpleDateFormat formatter1 = new SimpleDateFormat("MM-dd-yyyy hh:mm:ss");

String start="11-06-2016 00:57:01";

String end ="11-06-2016 01:56:01";

Date startdate = formatter1.parse(start);

Date enddate = formatter1.parse(end);

System.out.println("startDate is :" + startdate);

System.out.println("endDate is :" +enddate);

long dateRange = enddate.getTime() - startdate.getTime();

//if the difference between the two dates is > than 60 min i.e 3600000 ms, then throw exception.

System.out.println(dateRange);

if (dateRange > (60 * 60 * 1000)){

throw new Exception("Date time range cannot be greater than 60 minutes.(calculated using millisecond difference)");

}

输出量

[Date Range is = 7140000

Exception in thread "main" java.lang.Exception: Date time range cannot be greater than 60 minutes.(calculated using millisecond difference).

at Datetest.main(Datetest.java:28)][1]

在PST时区调用时,以上代码段引发异常。

回答:

SimpleDateFormat底层也没有Calendar指定在夏令时与标准时间之间重叠的时间内解析没有时区的datetime字符串时会发生什么。

您已经观察到它将返回较晚的时间,即与夏时制相比,它似乎更喜欢标准时间。但是,行为是不确定的,所以…

java.time但是,新类确实指定发生了什么,以及如何选择重叠的另一个“小时”。

在新的API中,由于您的datetime字符串没有时区,因此您可能首先使用进行解析LocalDateTime,然后应用时区来获取ZonedDateTime,例如

LocalDateTime ldtEnd = LocalDateTime.parse("2016-11-06T01:56:01");

ZonedDateTime zdtEnd = ldtEnd.atZone(ZoneId.of("America/Los_Angeles"));

// zdtEnd is now: 2016-11-06T01:56:01-07:00[America/Los_Angeles]

要查看重叠部分,您可以尝试添加一个小时:

ZonedDateTime zdtEnd2 = zdtEnd.plusHours(1);

// zdtEnd2 is now: 2016-11-06T01:56:01-08:00[America/Los_Angeles]

行为是明确定义的,请参见atZone()

在大多数情况下,本地日期时间只有一个有效偏移量。 时钟调回,则有两个有效的偏移量。 。

在间隙中,时钟向前跳,则没有有效的偏移量。取而代之的是,将本地日期时间调整为晚一些间隔时间。对于典型的一小时夏令时更改,本地日期时间将在一小时后移入通常对应于“夏季”的偏移量中。

重叠期间 ,

此方法的结果。要在存在间隙或重叠时引发异常,请使用ZonedDateTime.ofStrict(LocalDateTime,

ZoneOffset, ZoneId)

如您所见,它将始终以重叠的形式返回 较早的 时间,这与观察到的行为相反SimpleDateFormat。如果您希望 以后的

时间重叠,请致电withLaterOffsetAtOverlap()

如果您不想依赖已记录的默认值,则可以始终明确:

ZoneId PT = ZoneId.of("America/Los_Angeles");

LocalDateTime ldtStart = LocalDateTime.parse("2016-11-06T00:57:01");

ZonedDateTime zdtStartEarly = ldtStart.atZone(PT).withEarlierOffsetAtOverlap();

ZonedDateTime zdtStartLater = ldtStart.atZone(PT).withLaterOffsetAtOverlap();

System.out.println(zdtStartEarly); // 2016-11-06T00:57:01-07:00[America/Los_Angeles]

System.out.println(zdtStartLater); // 2016-11-06T00:57:01-07:00[America/Los_Angeles]

LocalDateTime ldtEnd = LocalDateTime.parse("2016-11-06T01:56:01");

ZonedDateTime zdtEndEarly = ldtEnd.atZone(PT).withEarlierOffsetAtOverlap();

ZonedDateTime zdtEndLater = ldtEnd.atZone(PT).withLaterOffsetAtOverlap();

System.out.println(zdtEndEarly); // 2016-11-06T01:56:01-07:00[America/Los_Angeles]

System.out.println(zdtEndLater); // 2016-11-06T01:56:01-08:00[America/Los_Angeles]

如您所见,对于00:57时间而言,这没有什么区别,因为该时间不在重叠时间内。

以上是 当输入日期处于从PDT到PST的过渡期时,如何处理日期? 的全部内容, 来源链接: utcz.com/qa/405993.html

回到顶部