【问题标题】:Java utc time in microseconds and in 15 microseconds blockJava utc 时间以微秒和 15 微秒为单位
【发布时间】:2012-12-20 16:04:00
【问题描述】:

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

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

【问题讨论】:

    标签: java date time utc simpledateformat


    【解决方案1】:

    唯一的问题是时间分辨率。一般来说,Java 通过java.util.Date 或System.currentTimeMillis() 支持毫秒精度。如果您需要更高的精度,System.nanoTime() 可能会成功。

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

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

    • 计算如下:

      (System.nanoTime() - S) / 15000
      
    • 如果值为0,我们在同一个15微秒范围内

    你确定 JVM 和你的程序真的可以利用这么小的时间吗?

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        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 微秒可以。而且,如果您考虑一下,该规则是否也适用于 Question 的问题,因为从零开始的 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();
            }
        }
        

        请注意输出行在“个数”列的微秒中是如何全部为零的,因为我们只要求报告时间,增量为十微秒,即 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.Date、Calendar 和 SimpleDateFormat。

        Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

        要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

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

        从哪里获得 java.time 类?

        • Java SE 8、Java SE 9 及更高版本
          • 内置。
          • 标准 Java API 的一部分,带有捆绑实现。
          • Java 9 添加了一些小功能和修复。
        • Java SE 6 和 Java SE 7
          • 大部分 java.time 功能都在ThreeTen-Backport 中向后移植到 Java 6 和 7。
        • Android
          • java.time 类的 Android 捆绑包实现的更高版本。
          • 对于早期的 Android (ThreeTenABP 项目采用 ThreeTen-Backport(如上所述)。见How to use ThreeTenABP…。

        ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

        【讨论】:

          猜你喜欢
          • 2012-10-08
          • 1970-01-01
          • 2014-06-24
          • 2010-12-15
          • 2012-01-12
          • 2016-02-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多