java - 在不损失精度的情况下将微秒转换为毫秒,并将格式设置为 Java 中的日期时间

标签 java timeunit

如何将以微秒为单位的传入长时间值转换为毫秒,然后将其格式化为数据时间戳,如下所示:

yyyyMMdd-HH:mm:ss.SSS

我正在使用 Java SimpleDateFormat 将长值格式化为时间戳。但是,将微秒转换为毫秒似乎是个问题,因为我失去了值(value)。

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS");

要将微秒转换为毫秒,我使用的是 TimeUnit:

long micro //microseconds
long milli = TimeUnit.MILLISECONDS.convert(micro, TimeUnit.MICROSECONDS);

在不丢失任何数据的情况下转换值的正确方法是什么?

最佳答案

I am using java SimpleDateFormat

不要。

避免与最早版本的 Java 捆绑在一起的危险的旧日期时间类。多年前,当采用 JSR 310 时,它们被 java.time 类取代。

convert incoming long time value in microseconds into milliseconds

不要。

java.time 类使用 nanoseconds 的分辨率,比你的微秒更精细。因此无需丢弃数据。

即时 =(整秒 + 小数秒作为纳米)

提取整秒数。

long seconds = TimeUnit.MICROSECONDS.toSeconds( micros ) ;

获取小数秒,减去整秒后剩余的微量。

long microsRemaining = 
    micros 
    -
    TimeUnit.SECONDS.toMicros( seconds ) 
;

将剩余的微转换为纳秒,因为我们接下来使用的 Instant 类表示整秒数加上纳秒数(小数秒)。

long nanos = TimeUnit.MICROSECONDS.toNanos( microsRemaining ) ;

将整数秒与以纳为单位的小数秒相结合。 Instant类表示 UTC 中的时刻,作为自 UTC 中 1970 年第一个时刻的纪元引用以来的计数,1970-01-01T00:00Z。

Instant instant = Instant.ofEpochSecond( seconds ).plusNanos( nanos ) ;

要生成标准 ISO 8601 格式的字符串,只需调用 toString

String output = instant.toString() ;

字符串末尾的 Z 表示 UTC(零时-分-秒的 UTC 偏移量),发音为 Zulu

您可以使用 DateTimeFormatter 类以您自己的自定义格式生成字符串。 Search Stack Overflow因为这已经被讨论过很多很多次了。

提示:您想要的格式非常接近 ISO 8601 格式,YYYY-MM-DDTHH:MM:SSZ,我强烈建议使用标准格式,而不是自行编写那个。

如果您希望通过特定地区(时区)人们使用的挂钟时间的镜头看到同一时刻,请应用 ZoneId 以获得 ZonedDateTime

ZoneId z = ZoneId.of( "Africa/Tunisia" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 在不损失精度的情况下将微秒转换为毫秒,并将格式设置为 Java 中的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53148094/

相关文章:

java - float 值上的 TimeUnit

java - 如何使用运行时在一秒钟内退出循环?

java - 传递 TimeUnits 并转换为毫秒

java - 使用 Facebook presto 解析器

java - junit 与基于 php 的应用程序集成

java - 采访 : How to ensure that a thread runs after another?

Java - 终端中的 FileNotFoundException

java - java中的正则表达式解析字符串

java - 什么 Java 库对象封装了数字和 `TimeUnit`?

java - ScheduleAtFixedRate 方法 - 更改 TimeUnit 参数?