Java 如何计算两个本地时间之间的秒数?

Java 如何计算两个本地时间之间的秒数?,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 +

在Java或Scala中,查找2
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