如何在Java/Scala中将时间戳(以微秒为单位)转换为日期.我的目标是比较两个时间戳并找出它们之间的差异.我正在使用java 8和示例Timestamp字符串是1474457086337977.我想将其转换为Date或Timestamp实例.
Instant.EPOCH.plus(
Duration.ofNanos(
TimeUnit.MICROSECONDS.toNanos(
Long.parse( "1474457086337977" ) ) ) )
Run Code Online (Sandbox Code Playgroud)
将字符串解析为a long以从时期获得微秒的计数.
long micros = Long.parse( "1474457086337977" );
Run Code Online (Sandbox Code Playgroud)
当然,您总是可以使用整数文字.请注意L附加到整数文字.
long micros = 1_474_457_086_337_977L ;
Run Code Online (Sandbox Code Playgroud)
Instant我们希望将UTC()中从1970年开始的时期的微秒数1970-01-01T00:00:00Z转换为Instant.该Instant级表示时间轴上的时刻UTC,分辨率为纳秒.这意味着小数部分的最多九位数.
所述Instant类具有用于从转换方便静态方法的整个秒数,从全秒计数加的分数秒以纳秒或从毫秒计数.但遗憾的是没有这样的方法可以计算微秒或纳秒.
作为一种解决方法,我们可以定义一个Duration并将其添加到已定义为常量的纪元参考日期.我们可以将a实例Duration化为几纳秒.要获得纳秒,我们将您的微秒乘以一千.注意使用64位long而不是32位int.
Duration duration = Duration.ofNanos( micros * 1_000L );
Instant instant = Instant.EPOCH.plus( duration );
Run Code Online (Sandbox Code Playgroud)
instant.toString():2016-09-21T11:24:46.337977Z
或者,您可以使用TimeUnit枚举将微秒转换为纳秒,而无需硬编码"幻数".
Duration duration = Duration.ofNanos( TimeUnit.MICROSECONDS.toNanos( micros ) );
Run Code Online (Sandbox Code Playgroud)
要调整其他偏移量或时区,请在StackOverflow中搜索Java类OffsetDateTime或ZonedDateTime.
您应该避免使用最早版本的Java捆绑的旧日期时间类型.事实证明,它们设计糟糕,令人困惑且麻烦.现在取代了java.time类型.
但是,如果您必须与尚未更新为java.time类型的旧代码进行交互,则可以转换为/来自java.time.查看添加到旧类的新方法.
java.sql.Timestamp ts = java.sql.Timestamp.from( instant );
Run Code Online (Sandbox Code Playgroud)
从java.time类型转换为java.util.Date或时,请注意数据丢失java.util.Calendar.这些类型仅解析为毫秒.从纳秒到毫秒的截断是静默地执行,从最后六个(九个)可能的数字秒数中删除.
java.util.Date utilDate = java.util.Date.from( instant ); // Caution: Data loss in truncating nanoseconds to milliseconds.
Run Code Online (Sandbox Code Playgroud)
该java.time框架是建立在Java 8和更高版本.这些类取代的麻烦旧日期,时间类,如java.util.Date,.Calendar,和java.text.SimpleDateFormat.
现在处于维护模式的Joda-Time项目建议迁移到java.time.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.
大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植,并进一步适应的Android在ThreeTenABP(见如何使用......).
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.