有没有办法在午夜后和15微秒的块中以微秒提取java utc时间?
意味着从1微秒到15微秒的时间将由相同的时间表示。
答案 0 :(得分:1)
唯一的问题是时间分辨率。通常,Java通过java.util.Date
或System.currentTimeMillis()
支持毫秒精度。如果您需要更高的精度,System.nanoTime()
可能会有所帮助。
但是这带来了另一个问题 - nanoTime()
与任何日历无关,它只是一个不断增长的具有纳秒级精度的计数器。我能想到的唯一解决方法是:
在午夜确定System.nanoTime()
值,将其称为S
。这可能有问题,但你不必等到午夜,一些简单的数学就足够了。
计算以下内容:
(System.nanoTime() - S) / 15000
如果值为0
,则我们处于相同的15微秒范围内
你确定JVM和你的程序能够真正利用这么小的时间吗?
答案 1 :(得分:0)
您可能需要查看this问题,了解有关获取时间的信息,以微秒为单位。 Java上不支持微秒日期计时。
Java支持日期(以毫秒为单位),在某些系统上,您可以通过System.nanoTime()
获得纳秒的系统时间。如果你的系统支持纳秒分辨率,那么编写一个可以转换纳秒数并将其四舍五入到15微秒块的函数会相当容易。
答案 2 :(得分:0)
Java 8及更高版本使此任务变得非常简单:将Clock
的替代实现作为 java.time 类的可选参数传递。
Instant.now( // Capture the current moment.
Clock.tick( // Access an alternate implementation of `Clock`.
Clock.systemDefaultZone() , // Start with the regular default implementation.
Duration.of( 10 , ChronoUnit.MICROS ) // Override to increment the “ticking” of the clock by this amount of time. Here we specify 10 microseconds, as 15 microseconds does not divide evenly into a whole second.
)
) // Returns an `Instant` object, the class replacing `java.util.Date`.
2018-04-04T21:55:46.537750Z←注意微秒的最后一位数总是为零。
跟踪日期时间的现代方法使用 java.time 类。
这些类采用Clock
的可选参数。当您在开发和测试期间需要更改或人工时钟时,这很方便。
您可以实施自己的Clock
。但是有几个替代实现与Clock
类本身捆绑在一起。其中一个是Clock.tick( clock , duration )
,它会按指定的Duration
增加时间。
获取一个时钟,该时钟将截断指定时钟的瞬间返回到指定持续时间的最近值。
如文件所述,捕获量是分数秒的大小均匀分布:
如果它的部分小于整个毫秒,则整个持续时间必须分成一秒而不留下余数。所有正常的滴答持续时间都符合这些标准,包括小时,分钟,秒和毫秒的任何倍数,以及合理的纳秒持续时间,例如20ns,250,000ns和500,000ns。
Instant.now( clock ) // Override default `Clock`.
所以15微秒在这里不起作用,但是10微秒。如果你考虑一下,那么这个规则是否也适用于问题的问题,因为从零开始的15微秒块不会成为偶数秒?
Duration d = Duration.of( 10 , ChronoUnit.MICROS ) ; // Define a span of time by which we want to increment the reporting of the current moment.
Clock clock = Clock.tick( Clock.systemDefaultZone() , d ); // Define a clock that increments by this span of time.
for ( int i = 1 ; i < 100 ; i++ ) {
System.out.println( Instant.now( clock ) ); // Override default `Clock` implementation with our special “chunky” incrementing clock.
// Sleep a moment.
try {
Thread.sleep( 3 ); // Sleep arbitrary amount of time.
} catch ( InterruptedException e ) {
e.printStackTrace();
}
}
注意输出行在微秒的“ones”列中如何都为零,因为我们要求报告时间仅为10微秒的增量,0.000010秒。
2018-04-04T21:55:46.537750Z
2018-04-04T21:55:46.550280Z
2018-04-04T21:55:46.553570Z
2018-04-04T21:55:46.556980Z
2018-04-04T21:55:46.560850Z
...
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; 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。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。