在Java中,将微秒转换为毫秒而不损失精度和格式作为日期时间

在Java中,将微秒转换为毫秒而不损失精度和格式作为日期时间,java,timeunit,Java,Timeunit,如何将以微秒为单位的传入长时间值转换为毫秒,然后将其格式化为数据时间戳,如下所示: yyyyMMdd HH:mm:ss.SSS 我使用JavaSimpleDataFormat将长值格式化为时间戳。但是,将微秒转换为毫秒似乎是个问题,因为我正在丢失该值 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS"); 要将微秒转换为毫秒,我使用的是时间单位: long micro //microseconds long m

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

yyyyMMdd HH:mm:ss.SSS

我使用Java
SimpleDataFormat
将长值格式化为时间戳。但是,将微秒转换为毫秒似乎是个问题,因为我正在丢失该值

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS");
要将微秒转换为毫秒,我使用的是时间单位:

long micro //microseconds
long milli = TimeUnit.MILLISECONDS.convert(micro, TimeUnit.MICROSECONDS);
在不丢失任何数据的情况下转换值的正确方法是什么

我正在使用java SimpleDataFormat

不要这样做。

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

将传入的长时间值转换为

不要这样做。

time类使用的分辨率为,比微秒还要精细。因此,无需丢弃数据

Instant
=(整秒+分数秒为毫微秒) 提取整秒数

long seconds = TimeUnit.MICROSECONDS.toSeconds( micros ) ;
long microsRemaining = 
    micros 
    -
    TimeUnit.SECONDS.toMicros( seconds ) 
;
得到分数秒,减去整秒后剩余的微秒数

long seconds = TimeUnit.MICROSECONDS.toSeconds( micros ) ;
long microsRemaining = 
    micros 
    -
    TimeUnit.SECONDS.toMicros( seconds ) 
;
将剩余的微秒转换为纳秒,因为我们接下来使用的
Instant
类表示整秒的计数加上纳秒的计数(分数秒)

以纳秒为单位,将整秒与分数秒合并。该类表示自UTC 1970年第一个时刻(1970-01-01T00:00Z)的历元参考以来的UTC时刻计数

Instant instant = Instant.ofEpochSecond( seconds ).plusNanos( nanos ) ;
要生成标准ISO 8601格式的字符串,只需调用
toString

String output = instant.toString() ;
字符串末尾的
Z
表示UTC(与UTC的偏移量为零小时分秒),发音为
Zulu

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

提示:您所需的格式非常接近ISO 8601格式,YYYY-MM-DDTHH:MM:SSZ,因此我强烈建议使用标准格式,而不是自己制作

如果您希望通过某个地区(时区)的人使用的挂钟时间来查看同一时刻,请应用
ZoneId
以获取
zoneDateTime

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

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android( 我正在使用java SimpleDataFormat

      不要这样做。

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

      将传入的长时间值转换为

      不要这样做。

      time类使用的分辨率为,比您的微秒还要精细,因此无需丢弃数据

      Instant
      =(整秒+分数秒为毫微秒) 提取整秒数

      long seconds = TimeUnit.MICROSECONDS.toSeconds( micros ) ;
      
      long microsRemaining = 
          micros 
          -
          TimeUnit.SECONDS.toMicros( seconds ) 
      ;
      
      得到分数秒,减去整秒后剩余的微秒数

      long seconds = TimeUnit.MICROSECONDS.toSeconds( micros ) ;
      
      long microsRemaining = 
          micros 
          -
          TimeUnit.SECONDS.toMicros( seconds ) 
      ;
      
      将剩余的微秒转换为纳秒,因为我们接下来使用的
      Instant
      类表示整秒的计数加上纳秒的计数(分数秒)

      将整秒与以纳秒为单位的分数秒相结合。该类表示自UTC 1970年第一个时刻(1970-01-01T00:00Z)的历元参考以来的UTC时刻计数

      Instant instant = Instant.ofEpochSecond( seconds ).plusNanos( nanos ) ;
      
      要生成标准ISO 8601格式的字符串,只需调用
      toString

      String output = instant.toString() ;
      
      字符串末尾的
      Z
      表示UTC(与UTC的偏移量为零小时分秒),发音为
      Zulu

      您可以使用
      DateTimeFormatter
      类以自己的自定义格式生成字符串

      提示:您所需的格式非常接近ISO 8601格式,YYYY-MM-DDTHH:MM:SSZ,因此我强烈建议使用标准格式,而不是自己制作

      如果您希望通过某个地区(时区)的人使用的挂钟时间来查看同一时刻,请应用
      ZoneId
      以获取
      zoneDateTime

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

      关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&

      该项目现已启动,建议迁移到类

      要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为

      您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
      java.sql.*
      classes

      从哪里获得java.time类

      • 、和更高版本-标准Java API的一部分,带有捆绑实现。
        • Java9添加了一些次要功能和修复