在Java或Scala中将微秒字符串转换为日期

Bal*_*raj -2 java scala

如何在Java/Scala中将时间戳(以微秒为单位)转换为日期.我的目标是比较两个时间戳并找出它们之间的差异.我正在使用java 8和示例Timestamp字符串是1474457086337977.我想将其转换为Date或Timestamp实例.

Bas*_*que 7

TL;博士

Instant.EPOCH.plus( 
    Duration.ofNanos( 
        TimeUnit.MICROSECONDS.toNanos( 
            Long.parse( "1474457086337977" ) ) ) )
Run Code Online (Sandbox Code Playgroud)

java.time

java.time类支持分辨率为纳秒,绰绰有余为您微秒.

解析一个数字的字符串

将字符串解析为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类OffsetDateTimeZonedDateTime.

转换为旧式日期时间类型

您应该避免使用最早版本的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.time框架是建立在Java 8和更高版本.这些类取代的麻烦旧日期,时间类,如java.util.Date,.Calendar,和java.text.SimpleDateFormat.

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

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植,并进一步适应的AndroidThreeTenABP(见如何使用......).

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.