从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
如果您的真正目标是表示与时钟或日历无关的时间跨度,那么您不应该使用LocalTime或java.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.time。java.sql.*
从哪里获得 java.time 类?
- Java SE 8、 Java SE 9、 Java SE 10、 Java SE 11和更高版本 - 标准 Java API 的一部分,具有捆绑实现。
- Java 9带来了一些小功能和修复。
- Java SE 6和Java SE 7
- 大部分java.time功能在ThreeTen- Backport中向后移植到 Java 6 & 7 。
- 安卓
- 更高版本的 Android (26+) 捆绑了java.time类的实现。
- 对于早期的 Android (<26),API 脱糖过程带来了java.time功能的一个子集,这些功能最初不是内置于 Android 中的。
- 如果脱糖不能满足您的需求,ThreeTenABP项目会将 ThreeTen-Backport(如上所述)适配到 Android。请参阅如何使用ThreeTenABP ...。