Java 以字符串格式从微秒创建实际日期,精度为微秒

Java 以字符串格式从微秒创建实际日期,精度为微秒,java,java-8,java.util.date,Java,Java 8,Java.util.date,我想从微秒开始创建java.util.Date对象。但我不想失去它的精度,从微秒到毫秒。目前,我正在以以下方式将微秒转换为日期对象。 如果我将微秒传递给日期构造函数,那么它会给出一个错误的日期,如56521-12-01 我不想把微秒转换成毫秒。是否有API或java-8实用程序的方法可以直接将微秒转换为日期对象 这个方法的问题是,去掉最后三位微秒,使之成为毫秒,然后从毫秒创建一个日期对象,解析器只需将其毫秒部分乘以1000,就可以将其转换为微秒。这样,我就丢失了一个实际的microsdests。

我想从微秒开始创建java.util.Date对象。但我不想失去它的精度,从微秒到毫秒。目前,我正在以以下方式将微秒转换为日期对象。 如果我将微秒传递给日期构造函数,那么它会给出一个错误的日期,如56521-12-01

我不想把微秒转换成毫秒。是否有API或java-8实用程序的方法可以直接将微秒转换为日期对象


这个方法的问题是,去掉最后三位微秒,使之成为毫秒,然后从毫秒创建一个日期对象,解析器只需将其毫秒部分乘以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" , "" ) ;