Java 如何计算两个本地时间之间的秒数?
在Java或Scala中,查找2Java 如何计算两个本地时间之间的秒数?,java,scala,datetime,time,Java,Scala,Datetime,Time,在Java或Scala中,查找2LocalTimes之间的秒数的最佳方法是什么 如果我有11:20:00.000Z和11:21:00.500Z我希望结果是61秒,而不是60秒。你可以用math.round()计算以毫秒为单位的时差,并用秒为单位对结果进行四舍五入。 [更新] 考虑到要比较的时间在同一时区,上述忽略时区计算工作正常。如果涉及不同的时区,则应使用@studx答案中的建议: val t1 = OffsetTime.parse("11:20:00.000Z") // UTC +
LocalTimes
之间的秒数的最佳方法是什么
如果我有
11:20:00.000Z
和11:21:00.500Z
我希望结果是61
秒,而不是60
秒。你可以用math.round()计算以毫秒为单位的时差,并用秒为单位对结果进行四舍五入。
[更新]
考虑到要比较的时间在同一时区,上述忽略时区计算工作正常。如果涉及不同的时区,则应使用@studx答案中的建议:
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
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中使用SimpleDataFormat
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
tl;博士
六十
截断
如果你想忽略分数秒,就把它们删掉
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.
使用枚举将经过的时间计算为总秒数
六十
顺便说一下,您的问题询问的是LocalTime
,它没有时区或UTC偏移量的概念。然而,您的示例时间末尾有一个Z
,它是Zulu
的缩写,表示UTC。因此,这些示例不能是LocalTime
值
如果您确实有UTC格式的日期时间值,请将它们表示为Instant
对象,而不是LocalTime
。并执行相同的逻辑:截断,并使用秒进行计算
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
类
从哪里获得java.time类
- ,及以后
- 内置的李>
- 标准JavaAPI的一部分,带有捆绑实现
- Java9添加了一些次要功能和修复
- 及
- 大部分java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(您希望使用
LocalTime
,但是输入(11:20:00.000Z)的最后是Z
,这就是。如果时间是UTC,忽略此信息是不明智的-假设其他输入可能有其他偏移
因此,我不会忽略Z
,并且:
两个输入都有相同的偏移量,因此使用LocalTime
也可以。但是如果有具有不同偏移量的输入,则使用OffsetTime
是正确的类型
然后以毫秒为单位计算差值,并对其进行四舍五入以获得四舍五入的秒数:
long millis = ChronoUnit.MILLIS.between(t1, t2);
long seconds = Math.round(millis / 1000.0); // 61
尝试LocalTime#直到
LocalTime pass=LocalTime.now().minusSeconds(4);
LocalTime now=LocalTime.now();
System.out.println(“4==”+过去.直到(现在,ChronoUnit.SECONDS));
您可以在的文档中找到有关该方法的更多信息。这不是一个舍入问题吗(从60.5秒开始)?讨论如何在几分钟内完成此操作。@Joe C,因为我的用例要求这样做。例如,如果我想要以秒为单位的飞行长度,我决定将其舍入到最接近的秒数。@Thilo是的,这是一个舍入问题。几乎每个日期/时间库似乎都是向下舍入,而不是向上舍入。您的时间似乎是OffsetTime
sra而不是LocalTime
s。只要两者都有相同的偏移量,这没关系。它们有不同的偏移量吗?这会使事情复杂化,但仍然可以找到解决方案。谢谢。这是我决定的方式。我不知道是否有更优雅的方式。请不要教年轻人使用long-outdated和臭名昭著的麻烦SimpleDataFormat
。今天我们有了这么多更好的功能。询问者可能已经在使用它了。使用它也很好。谢谢@OleV.V。我也在学习自己。:)更新了我的答案:)很好。谢谢使用java.time,您可以不用显式格式化程序,只需LocalTime.parse(time1.replace(“Z”),即可(我相信)。或者更优雅的OffsetTime.parse(time1).toLocalTime()
(使用Java语法)。是的,我只是想为其他读者添加额外的信息,否则我的答案和Leo的答案@OleV.V没有任何区别。
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.
long seconds = ChronoUnit.SECONDS.between( start , stop ) ;
OffsetTime t1 = OffsetTime.parse("11:20:00.000Z");
OffsetTime t2 = OffsetTime.parse("11:21:00.500Z");
long millis = ChronoUnit.MILLIS.between(t1, t2);
long seconds = Math.round(millis / 1000.0); // 61