你如何找到两个当地时间之间的秒数?

时间:2018-03-21 00:00:59

标签: java scala datetime time

在Java或Scala中,查找2 LocalTimes之间的秒数的最佳方法是什么?

如果我有11:20:00.000Z11:21:00.500Z,我希望结果为61秒,而不是60秒。

5 个答案:

答案 0 :(得分:2)

您可以使用millis计算时间差math.round()并以秒为单位舍入结果

import java.time.{LocalTime, OffsetTime}
import java.time.temporal.ChronoUnit.MILLIS

val t1 = LocalTime.parse("11:20:00.000")
val t2 = LocalTime.parse("11:21:00.500")

math.round(MILLIS.between(t1, t2) / 1000.0)
// res1: Long = 61

[UPDATE]

由于要比较的时间在同一时区,上述时区忽略的计算工作正常。如果涉及不同的时区,则应使用@ studx的答案中建议的OffsetTime

val t1 = OffsetTime.parse("11:20:00.000Z")      // UTC +00:00
val t2 = OffsetTime.parse("11:21:00.500-01:00") // UTC -01:00

math.round(MILLIS.between(t1, t2) / 1000.0)
// res2: Long = 3661

答案 1 :(得分:2)

尝试LocalTime#until

LocalTime past = LocalTime.now().minusSeconds(4);
LocalTime now = LocalTime.now();

System.out.println("4 == " + past.until(now, ChronoUnit.SECONDS));

您可以在LocalTime#until的文档中找到有关该方法的更多信息。

答案 2 :(得分:1)

您想使用LocalTime,但输入(11:20:00.000Z)最后有Z,即UTC designator。如果时间是UTC,则忽略此信息是不明智的 - 假设其他输入可能有另一个偏移。

所以我不会忽略Zuse the proper type

OffsetTime t1 = OffsetTime.parse("11:20:00.000Z");
OffsetTime t2 = OffsetTime.parse("11:21:00.500Z");

两个输入都具有相同的偏移量,因此使用LocalTime也可以。但如果有不同偏移的输入,则OffsetTime是正确的类型。

然后你得到毫秒的差异并将其四舍五入以获得舍入的秒数:

long millis = ChronoUnit.MILLIS.between(t1, t2);
long seconds = Math.round(millis / 1000.0); // 61

答案 3 :(得分:0)

java.time中的DateFormatter,LocalTime和Duration

val time1 = "11:20:00.000Z"
val time2 = "11:21:00.500Z"

import java.time._
import java.time.format._
val format = DateTimeFormatter.ofPattern("HH:mm:ss.SSS")
val parsedTime1 = LocalTime.parse(time1.replace("Z", ""), format)
val parsedTime2 = LocalTime.parse(time2.replace("Z", ""), format)
val diff = Duration.between(parsedTime1, parsedTime2)
val roundedSeconds = math.round((diff.getSeconds.toDouble+(diff.getNano.toDouble/1000000000.0)))
println(roundedSeconds)
//61 is printed

在java.text中使用SimpleDateFormat

val time1 = "11:20:00.000Z"
val time2 = "11:21:00.500Z"

import java.text._
val format = new SimpleDateFormat("HH:mm:ss.SSSZ")
val parsedTime1 = format.parse(time1.replaceAll("Z$", "+0000"))
val parsedTime2 = format.parse(time2.replaceAll("Z$", "+0000"))
val diff = math round (parsedTime2.getTime - parsedTime1.getTime)/1000.0
println(diff)
//61 is printed

答案 4 :(得分:0)

TL;博士

ChronoUnit.SECONDS.between(                                                // Calculate elapsed time as a total number of seconds.
    LocalTime.parse( "11:20:00.000" ).truncatedTo( ChronoUnit.SECONDS ) ,  // Parse string as a `LocalTime` time-of-day, then lop off any fractional second.
    LocalTime.parse( "11:21:00.500" ).truncatedTo( ChronoUnit.SECONDS )    // Lop off the half-second present in this `LocalTime` object. 
)
  

60

截断

如果你想忽略小数秒,truncate,只需将它们关掉。

LocalTime start = LocalTime.parse( "11:20:00.000" ).truncatedTo( ChronoUnit.SECONDS ) ;
LocalTime stop = LocalTime.parse( "11:21:00.500" ).truncatedTo( ChronoUnit.SECONDS ) ;  // Lop off the extra half-second we don't care about.

使用ChronoUnit枚举计算经过时间作为总秒数。

long seconds = ChronoUnit.SECONDS.between( start , stop ) ;
  

60

顺便说一下,你的问题询问LocalTime,它没有时区概念或从UTC偏移。然而,您的示例时间最后有一个Z,它是Zulu的缩写,表示UTC。因此,这些示例不能是LocalTime值。

如果您确实拥有UTC的日期时间值,请将它们表示为Instant个对象而不是LocalTime。并执行相同的逻辑:截断,并使用SECONDS.between计算。

关于 java.time

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

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

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