当前位置: 首页 > 知识库问答 >
问题:

Java8:计算两个ZonedDateTime之间的差异

舒浩邈
2023-03-14

我正在尝试编写一个方法来打印两个ZonedDateTimes之间的时间差,关于时区之间的差异。

我找到了一些解决方案,但它们都是为使用LocalDateTime而编写的。

共有3个答案

祝叶五
2023-03-14

这为您提供了两个ZonedDateTimes之间的分钟。

int minutes = (int) (end.toEpochSecond() - start.toEpochSecond()) / 60;
龙俊良
2023-03-14

小时、分钟、秒:

Duration.between( zdtA , zdtB )  // Represent a span-of-time in terms of days (24-hour chunks of time, not calendar days), hours, minutes, seconds. Internally, a count of whole seconds plus a fractional second (nanoseconds).

对于年,月,日:

Period.between(                  // Represent a span-of-time in terms of years-months-days. 
    zdtA.toLocalDate() ,         // Extract the date-only from the date-time-zone object. 
    zdtB.toLocalDate() 
)

Michal S的答案是正确的,显示了<code>ChronoUnit</code>。

另一种方法是Duration周期类。第一个用于更短的时间跨度(小时、分钟、秒),第二个用于更长的时间跨度(年、月、天)。

Duration d = Duration.between( zdtA , zdtB );

通过调用 toString 生成标准 ISO 8601 格式的字符串。格式为 PnYnMnDTnHnMnS,其中 P 标记开头,T 分隔两个部分。

String output = d.toString();

在 Java 9 及更高版本中,调用 to...用于获取各个组件的部件方法。在我的另一个答案中讨论过。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdtStart = ZonedDateTime.now( z );
ZonedDateTime zdtStop = zdtStart.plusHours( 3 ).plusMinutes( 7 );

Duration d = Duration.between( zdtStart , zdtStop );

2016-12-11t 03:07:50.639-05:00[美国/蒙特利尔]/2016-12-11t 06:14:50.639-05:00[美国/蒙特利尔]

PT3H7M

查看IdeOne.com的现场html" target="_blank">代码。

ThreeTen-Extra 项目向 java.time 类添加了功能。它的一个方便的类是间隔,它将时间跨度表示为时间轴上的一对点。另一个是LocalDateRange,用于一对LocalDate对象。相反,经期

Interval 的工厂方法采用一对 Instant 对象。

Interval interval = Interval.of( zdtStart.toInstant() , zdtStop.toInstant() );

您可以从间隔中获取持续时间

Duration d = interval.toDuration();

java.time框架被构建到Java8及更高版本中。这些类取代了麻烦的旧的旧日期时间类,例如java.util.DateCalendar

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。

您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获取 java.time 类?

    < li>Java SE 8、Java SE 9、Java SE 10和更高版本 < ul > < li >内置。 < li >捆绑实现的标准Java API的一部分。 < li>Java 9增加了一些小功能和修复。
  • 许多java.time功能被反向移植到Java6
  • java的Android捆绑包实现的更高版本。上课时间到了
  • 对于早期的Android(

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter等。

颜河
2023-03-14

您可以在from和ChronoUnit之间使用此方法。

该方法将这些时间转换为相同的时区(第一个参数中的时区),然后调用,直到在时态接口中声明了方法:

static long zonedDateTimeDifference(ZonedDateTime d1, ZonedDateTime d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

由于ZonedDateTime和LocalDateTime都实现了Temporal接口,因此您也可以为这些日期时间类型编写通用方法:

static long dateTimeDifference(Temporal d1, Temporal d2, ChronoUnit unit){
    return unit.between(d1, d2);
}

但请记住,对混合LocalDateTime和ZonedDateTime调用此方法会导致DateTimeException希望能有所帮助。

 类似资料:
  • 问题内容: 我正在尝试编写一种方法来打印两个 ZonedDateTime 之间的 时差 ,关于时区之间的时差。 我找到了一些解决方案,但所有解决方案均编写为可与 LocalDateTime一起使用 。 问题答案: 您可以使用方法 之间 的 ChronoUnit 。 此方法将那些时间转换为相同的区域(第一个参数的区域),然后,调用 直到 在 Temporal 接口中声明的方法 为止 : 由于 Zon

  • 问题内容: 我试图计算两者之间的差异。 输出必须为格式。这是我写的: 我得到的输出是。我已经从该网站检查了我的结果(带有)。以下屏幕截图显示了输出: 我很确定月份值后面的字段在我的代码中出了错。任何建议都将非常有帮助。 更新资料 我已经从另一个网站测试了我的结果,但是得到的结果却有所不同。在这里是:计算两个日期之间的持续时间(结果:29年,8个月,24天,12小时,0分钟和50秒)。 更新资料 由

  • 问题内容: 我有一个带有StartDate列的表,我想计算两个连续记录之间的时间差。 谢谢。 @ Mark Byers和@ Yahia,我将请求表作为requestId,startdate 我想知道requestid 1和2、2和3、3和4等之间的时差是多少。我知道我需要在表上进行自我连接,但是我在子句上没有得到正确的支持。 问题答案: 要实现您的要求,请尝试以下操作(从OP编辑后进行更新): 如

  • 问题内容: 请包括nanos,否则将是无关紧要的: [编辑]我想要最精确的结果,所以不要双打;仅整数/长算术。同样,结果必须是肯定的。伪代码: 例子: 是的,在java.sql.Timestamp中毫秒被复制的时间和毫微秒不相上下,所以1001个毫秒装置1秒(1000)和1毫这是在部件和部分,因为1毫秒= 1000000毫微秒)。这比看起来要狡猾得多。 我建议不要在未实际测试代码或未准备好工作代码

  • 问题内容: 我在-type字段中将上次登录时间存储在MySQL中。当用户登录时,我想获取上次登录时间与当前时间(我使用)之间的时差。 我该如何计算? 问题答案: 使用MySQL函数。例如,您可以使用: 在您的情况下,函数的第三个参数将是当前登录时间()。第二个参数是上次登录时间,该时间已在数据库中。

  • 问题内容: 我在一个MySQL数据库表上工作,该表的列包含我对其他主机执行ping操作时的时间戳记(例如2014-09-16 09:08:05)。我的问题是如何在几分钟内计算出针对特定主机的第一次ping和最后一次ping之间的差异?另外,如何为上述差异的开始和结束指定不同的时间戳(而不是第一次和最后一次ping)。这是表格的示例: 我希望我已经对自己的解释足够清楚。 问题答案: 您可以使用本机的