gpt4 book ai didi

java - 使用两个 Date 对象的持续时间计算问题

转载 作者:行者123 更新时间:2023-11-29 06:51:28 25 4
gpt4 key购买 nike

我在类里面有一个方法可以计算两个日期的小时持续时间。

public static double getDuration(Date startDate, Date endDate){
return (endDate.getTime()-startDate.getTime()) / (1000.0 * 60 * 60);
}

我输入的日期是 28-10-2017 14:0029-10-2017 02:00。在夏令时期间,持续时间给出 13.0,这是错误的。

如果我用这个输入编写一个简单的程序,我会得到正确的结果。所以只需检查 Date 对象。在我的应用程序输入中,开始日期为 dayofWeek,开始日期为 7,结束日期为 1。但是我的简单程序将开始日期设为 1,结束日期设为 2。知道这是怎么回事吗?

最佳答案

tl;dr

对于 Java 6 和 Java 7,使用 ThreeTen-Backport 项目。

12小时

下午 2 点到凌晨 2 点之间 Europe/Berlin这些日期的时区是十二小时。

org.threeten.bp.temporal.ChronoUnit.HOURS.between( 

org.threeten.bp.LocalDateTime
.parse( "2017-10-28T14:00:00" )
.atZone( org.threeten.bp.ZoneId.of( "Europe/Berlin" ) ) , // Producing a `ZonedDateTime` instance.

org.threeten.bp.LocalDateTime
.parse( "2017-10-29T02:00:00" )
.atZone( org.threeten.bp.ZoneId.of( "Europe/Berlin" ) ) // Producing another `ZonedDateTime` instance.

)

12

13 小时

查看Daylight Saving Time (DST)的效果切换时间定在柏林时间凌晨 3 点,将您的起停时间更改为下午 3 点和凌晨 3 点,以便获得 13 小时而不是 12 小时。

02:00-03:00 重复,如 Answer by Hugo 中所述.

org.threeten.bp.temporal.ChronoUnit.HOURS.between( 

org.threeten.bp.LocalDateTime
.parse( "2017-10-28T15:00:00" )
.atZone( org.threeten.bp.ZoneId.of( "Europe/Berlin" ) ) , // Producing a `ZonedDateTime` instance.

org.threeten.bp.LocalDateTime
.parse( "2017-10-29T03:00:00" )
.atZone( org.threeten.bp.ZoneId.of( "Europe/Berlin" ) ) // Producing another `ZonedDateTime` instance.

)

13

查看此 code run live at IdeOne.com ,使用 Java 8 中内置的 java.time 类。

java.time

这已在 Stack Overflow 上多次介绍,因此请搜索更多信息。

简单地说……

避免使用 Date 类。仅使用 java.time 类。同样,避免将 Joda-Time 项目用于新工作,因为团队建议迁移到 java.time 类。

将您的输入字符串解析为 LocalDateTime 值,因为它们缺少时区指示符或与 UTC 的偏移量。 LocalDateTime 代表时间轴上的实际时刻,但我们会到达那里;继续阅读。

提示:以标准 ISO 8601 格式编写日期时间字符串,在解析/生成字符串时在 java.time 类中默认使用。

为这些值定义一个时区 (ZoneId)。通过 continent/region 格式的专有名称指定区域,例如 Africa/Cas​​ablancaEurope/Berlin。切勿使用 3-4 个伪区域名称,例如 PSTCST

应用区域为每个时刻生成一个 ZonedDateTime 对象。

通过实例化 Duration 对象或调用 ChronoUnit.HOURS.between 计算耗时。

许多 java.time 功能在 ThreeTen-Backport 中被反向移植到 Java 6 和 Java 7项目。 java.time 类内置于 Java 8 和 Java 9 中。


Table of all date-time types in Java, both modern and legacy


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

从哪里获取 java.time 类?

关于java - 使用两个 Date 对象的持续时间计算问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46772268/

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