Java utc时间以微秒为单位,以15微秒为单位

时间:2012-12-20 16:04:01

标签: java date time utc simpledateformat

有没有办法在午夜后和15微秒的块中以微秒提取java utc时间?

意味着从1微秒到15微秒的时间将由相同的时间表示。

3 个答案:

答案 0 :(得分:1)

唯一的问题是时间分辨率。通常,Java通过java.util.DateSystem.currentTimeMillis()支持毫秒精度。如果您需要更高的精度,System.nanoTime()可能会有所帮助。

但是这带来了另一个问题 - nanoTime()与任何日历无关,它只是一个不断增长的具有纳秒级精度的计数器。我能想到的唯一解决方法是:

  • 在午夜确定System.nanoTime()值,将其称为S。这可能有问题,但你不必等到午夜,一些简单的数学就足够了。

  • 计算以下内容:

    (System.nanoTime() - S) / 15000
    
  • 如果值为0,则我们处于相同的15微秒范围内

你确定JVM和你的程序能够真正利用这么小的时间吗?

答案 1 :(得分:0)

您可能需要查看this问题,了解有关获取时间的信息,以微秒为单位。 Java上不支持微秒日期计时。

Java支持日期(以毫秒为单位),在某些系统上,您可以通过System.nanoTime()获得纳秒的系统时间。如果你的系统支持纳秒分辨率,那么编写一个可以转换纳秒数并将其四舍五入到15微秒块的函数会相当容易。

答案 2 :(得分:0)

TL;博士

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

跟踪日期时间的现代方法使用 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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore