我正在尝试编写一个方法来打印两个ZonedDateTimes之间的时间差,关于时区之间的差异。
我找到了一些解决方案,但它们都是为使用LocalDateTime而编写的。
这为您提供了两个ZonedDateTimes之间的分钟。
int minutes = (int) (end.toEpochSecond() - start.toEpochSecond()) / 60;
小时、分钟、秒:
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.Date
、Calendar
,
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程。以及搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序。不需要字符串,不需要java.sql.*
类。
从哪里获取 java.time 类?
ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
等。
您可以在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)。这是表格的示例: 我希望我已经对自己的解释足够清楚。 问题答案: 您可以使用本机的