Java 以字符串格式从微秒创建实际日期,精度为微秒
我想从微秒开始创建java.util.Date对象。但我不想失去它的精度,从微秒到毫秒。目前,我正在以以下方式将微秒转换为日期对象。 如果我将微秒传递给日期构造函数,那么它会给出一个错误的日期,如56521-12-01 我不想把微秒转换成毫秒。是否有API或java-8实用程序的方法可以直接将微秒转换为日期对象Java 以字符串格式从微秒创建实际日期,精度为微秒,java,java-8,java.util.date,Java,Java 8,Java.util.date,我想从微秒开始创建java.util.Date对象。但我不想失去它的精度,从微秒到毫秒。目前,我正在以以下方式将微秒转换为日期对象。 如果我将微秒传递给日期构造函数,那么它会给出一个错误的日期,如56521-12-01 我不想把微秒转换成毫秒。是否有API或java-8实用程序的方法可以直接将微秒转换为日期对象 这个方法的问题是,去掉最后三位微秒,使之成为毫秒,然后从毫秒创建一个日期对象,解析器只需将其毫秒部分乘以1000,就可以将其转换为微秒。这样,我就丢失了一个实际的microsdests。
这个方法的问题是,去掉最后三位微秒,使之成为毫秒,然后从毫秒创建一个日期对象,解析器只需将其毫秒部分乘以1000,就可以将其转换为微秒。这样,我就丢失了一个实际的microsdests。您将无法使用java.util.Date执行此操作: 类日期表示特定的时间瞬间,精度为毫秒
日期具有毫秒分辨率。新的时间类要好得多,不过需要更多的努力。使用LocalDateTime只是一种替代方法:
LocalDateTime date =
LocalDateTime.ofInstant(Instant.ofEpochMilli(millis), ZoneId.systemDefault());
但是,如果您只需要一种格式良好的时间戳,您可以使用:
LocalDateTime.now()
tl;博士
避免遗留日期时间类
您正在使用可怕的日期时间类,这些类在几年前被JSR310中定义的现代java.time类所取代
此外,正如其他人所指出的,遗留类不能容纳微秒,只能容纳毫秒。事实上,遗留类java.sql.Timestamp试图表示纳秒,但这是通过一个可怕的黑客攻击实现的,包括毫秒的分数秒和真正混乱的纳秒分数秒
java.time
样本数据
作为演示,让我们创建自1970年第一个UTC时刻以来的微秒数示例
// Convert to microseconds. Use as input value to further code below.
Instant instantPrime = Instant.now().truncatedTo( ChronoUnit.MICROS ); // Drop any nanoseconds, to keep only microseconds.
long wholeSecondsPrime = instantPrime.getEpochSecond();
long nanoAdjustmentPrime = instantPrime.getNano();
long microseconds =
TimeUnit.SECONDS.toMicros( wholeSecondsPrime ) +
TimeUnit.NANOSECONDS.toMicros( nanoAdjustmentPrime )
;
处理
让我们把微秒数分成两部分,一部分是自1970-01-01T00:00Z以来的整秒数,另一部分是以微秒为单位的小数秒数
// Convert from microseconds.
long wholeSeconds = TimeUnit.MICROSECONDS.toSeconds( microseconds );
long nanoAdjustment = TimeUnit.MICROSECONDS.toNanos( microseconds ) - TimeUnit.SECONDS.toNanos( wholeSeconds );
把它们重新组合起来
Instant instant = Instant.ofEpochSecond( wholeSeconds , nanoAdjustment );
boolean match = instant.equals( instantPrime );
转储到控制台
System.out.println( "instantPrime = " + instantPrime );
System.out.println( "wholeSecondsPrime = " + wholeSecondsPrime );
System.out.println( "nanoAdjustmentPrime = " + nanoAdjustmentPrime );
System.out.println( "microseconds = " + microseconds );
System.out.println( "wholeSeconds = " + wholeSeconds );
System.out.println( "nanoAdjustment = " + nanoAdjustment );
System.out.println( "instant = " + instant );
System.out.println( "match = " + match );
InstantTime=2020-01-07T23:32:26.385565Z
批发价格指数=1578439946
nanoAdjustmentPrime=385565000
微秒=1578439946385565
整秒=1578439946
纳米调整=385565000
瞬间=2020-01-07T23:32:26.385565Z
匹配=真
串
使用标准ISO 8601格式生成表示即时消息值的文本
String output = instant.toString() ;
2020-01-07T23:32:26.385565Z
您所需的格式接近于此。将T替换为空格。去掉Z,但要小心。将日期时间显示为文本而不指示时区或与UTC的偏移量会给读者造成歧义和困惑。我建议包括Z
2020-01-07 23:32:26.385565
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&
要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是
该项目现已启动,建议迁移到类
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*类
从哪里获得java.time类
、和更高版本-标准Java API的一部分,带有捆绑实现。
Java9添加了一些次要功能和修复。
和
大多数java.time功能都在中向后移植到Java6和Java7。
更高版本的Android捆绑包实现了java.time类。
对于早期的Android,您的第一个错误是试图在java 8中使用java.util.Date。LocalDateTime可能是一个有效的替代方案。它是否适合您的目的?我建议您不要使用SimpleDateFormat和Date。这些类设计得很糟糕,而且早已过时,其中前者尤其令人讨厌。而是使用Instant、DateTimeFormatter和来自的其他类。这是否回答了您的问题?和/或这个?显示示例数据。我的用例是仅将微秒转换为“实际时间的字符串表示”,精度为微秒。我可以用其他类来代替Date。@KhalidShah那么你应该编辑这个问题并这样说。在int秒处缺失=int微秒/1_000_000;错班了。LocalDateTime类不能表示时刻,因为它缺少时区上下文或UTC偏移量。更改为OffsetDateTime。感谢@JoopEggen it’s really hepful:问题是关于微秒,而不是毫秒。非常感谢@Basil提供的详细信息:我在我的机器上执行相同的上述代码,但它将以不同的方式打印时间。InstantTime=2020-01-08T11:29:19.065Z整秒素数=1578482959纳秒调整素数=65000000微秒=1578482959065000整秒=1578482959纳秒调整=65000000整秒=2020-01
-08T11:29:19.065Z match=true它只以毫秒为单位显示时间。@KhalidShah您正在运行Java 8吗?该版本使用了以毫秒为单位捕获当前时刻的实现。Java 9和更高版本的一些实现使用一个新的时钟,以微秒为单位捕获当前时刻。time类可以表示纳秒,但是传统的计算机硬件时钟没有那么精确
Instant instant = Instant.ofEpochSecond( wholeSeconds , nanoAdjustment );
boolean match = instant.equals( instantPrime );
System.out.println( "instantPrime = " + instantPrime );
System.out.println( "wholeSecondsPrime = " + wholeSecondsPrime );
System.out.println( "nanoAdjustmentPrime = " + nanoAdjustmentPrime );
System.out.println( "microseconds = " + microseconds );
System.out.println( "wholeSeconds = " + wholeSeconds );
System.out.println( "nanoAdjustment = " + nanoAdjustment );
System.out.println( "instant = " + instant );
System.out.println( "match = " + match );
String output = instant.toString() ;
String output = instant.toString().replace( "T" , " " ).replace( "Z" , "" ) ;