在Java或Scala中,查找2 LocalTimes
之间的秒数的最佳方法是什么?
如果我有11:20:00.000Z
和11:21:00.500Z
,我希望结果为61
秒,而不是60
秒。
答案 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,则忽略此信息是不明智的 - 假设其他输入可能有另一个偏移。
所以我不会忽略Z
和use 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)
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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance 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的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。