从Time到Long的转换错误(毫秒)

我是 Java 和转换格式的新手,我对转换有疑问,这是代码

Time time_normal_format;
long time_milliseconds;

time_milliseconds = time_normal_format.getTime();
//time_normal_format prints on screen "00:00:05"//

System.out.println("Time in milliseconds: "+time_milliseconds);

我怀疑这就是为什么我的转换在 time_milliseconds 上设置“21605000”而不是 5000。

回答

tl;博士

Duration
.between(
    LocalTime.MIDNIGHT , 
    myJavaSqlTime.toLocalTime()
)
.toMillis()

避免遗留的日期时间类

显然你正在使用java.sql.Time类。别。

与最早版本的 Java 捆绑在一起的日期时间类很糟糕,它们是由不了解日期时间处理的细微差别和复杂性的人编写的。在设计中添加一些非常糟糕的选择,结果是一团糟。

时间

旧的日期时间类在多年前被现代java.time类所取代。

LocalTime

要表示一天中的时间,没有日期和时区,请使用LocalTime.

LocalTime lt = LocalTime.of( 15 , 30 ) ;    // 3:30 PM
LocalTime lt = LocalTime.parse( "15:30" ) ; // ditto

要获取自午夜以来的毫秒数,请使用Duration.

Duration d = Duration.between( LocalTime.MIDNIGHT , lt ) ;
long millis = d.toMillis() ;

走向另一个方向,从午夜开始的毫秒计数到一天中的某个时间。

Duration d = Duration.ofMillis( 5_000 ) ;
LocalTime lt = LocalTime.MIDNIGHT.plus( d ) ;

请记住,这种代码仅适用于一般的 24 小时工作日。在现实世界中,在不同的时区,一天可能不是 24 小时。使用夏令时 (DST) 切换时,它们可以是 23 或 25 小时。而且它们实际上可以是政治家规定的任何长度,例如 23.5 小时,或 15 分钟,或出于各种政治、文化、外交或军事原因认为值得的任何其他调整。

与遗留类之间的转换

如果您必须与一些尚未更新为java.time 的旧代码进行互操作,您可以轻松地来回转换。寻找添加到旧类中的新方法。如果给定一个java.sql.Time对象,则调用toLocalTime以获取一个LocalTime对象。

LocalTime lt = myJavaSqlTime.toLocalTime() ;

走向另一个方向,从现代班级到传统班级。

java.sql.Time myJavaSqlTime = Time.valueOf( lt ) ;

Duration

如果您的真正目标是表示与时钟或日历无关的时间跨度,那么您应该使用LocalTimejava.sql.Time

相反,您应该使用Durationclass 在未附加到时间线的情况下以小时-分钟-秒的比例表示时间跨度。(对于年-月-日的规模,请使用Period类。)

为了以文本方式表示这样的时间跨度,我强烈建议不要使用时钟时间格式,例如00:00:05. 这样的字符串本质上是模棱两可的,看起来像一天中的时间。

ISO 8601

相反,请使用标准ISO 8601格式:PnYnMnDTnHnMnS. 该P标志的开始。该T分离任何小时-分-秒的任何年,月,日。所以你的五秒钟的例子是PT5S.

java.time类解析/生成的日期-时间文本时使用ISO 8601种格式默认。

Duration d = Duration.parse( "PT5S" ) ;

走向另一个方向。

String output = Duration.ofSeconds( 5 ).toString() ;   // PT5S

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310。

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

您可以直接与您的数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC 驱动程序。不需要字符串,不需要类。Hibernate 5 & JPA 2.2 支持java.timejava.sql.*

从哪里获得 java.time 类?

  • Java SE 8 Java SE 9 Java SE 10 Java SE 11和更高版本 - 标准 Java API 的一部分,具有捆绑实现。
    • Java 9带来了一些小功能和修复。
  • Java SE 6Java SE 7
    • 大部分java.time功能在ThreeTen- Backport中向后移植到 Java 6 & 7 。
  • 安卓
    • 更高版本的 Android (26+) 捆绑了java.time类的实现。
    • 对于早期的 Android (<26),API 脱糖过程带来了java.time功能的一个子集,这些功能最初不是内置于 Android 中的。
      • 如果脱糖不能满足您的需求,ThreeTenABP项目会将 ThreeTen-Backport(如上所述)适配到 Android。请参阅如何使用ThreeTenABP ...

以上是从Time到Long的转换错误(毫秒)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>