如何将以微秒
为单位的传入长时间值转换为毫秒
,然后将其格式化为数据时间戳,如下所示:
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 类?
- > Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , 以及后来的 - 标准 Java API 的一部分,带有捆绑实现。
- Java 9 添加了一些次要功能和修复。
- > Java SE 6和 Java SE 7
- 在 ThreeTen-Backport 中,大部分 java.time 功能都向后移植到 Java 6 和 7。 .
- > Android
- 更高版本的 Android bundle 实现 java.time 类。
- 对于早期的 Android (<26),ThreeTenABP项目改编ThreeTen-Backport (上文提到的)。参见 How to use ThreeTenABP… .
ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, 和 more .
关于java - 在不损失精度的情况下将微秒转换为毫秒,并将格式设置为 Java 中的日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53148094/