【问题标题】:How can I get the count of milliseconds since midnight for the current?如何获取当前午夜以来的毫秒数?
【发布时间】:2012-08-02 20:26:19
【问题描述】:

注意,我不想要时代的毫秒。我想要当前时钟的毫秒数。

例如,我有这段代码。

Date date2 = new Date(); 
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);

有没有办法获得日期的毫秒数? 有没有其他方法可以做到这一点?

注意:System.currentTimeMillis() 给了我来自时代的毫秒,这不是我想要的。

【问题讨论】:

标签: java date time milliseconds


【解决方案1】:

你的意思是?

long millis = System.currentTimeMillis() % 1000;

顺便说一句,Windows 不允许时间旅行到 1969 年

C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.

【讨论】:

  • 请注意,如果您及时回到 Unix 纪元之前,这将给出一个负值,而使用 c.get(Calendar.MILLISECOND) 则不应该。始终考虑极端情况!
  • 如果有人定义了不在第二个边界上的时区或添加了闰毫秒,这会中断。=))
  • Java 不支持时间旅行。
  • @MarkusMikkolainen:不,System.currentTimeMillis() 不受时区影响。
  • @PeterLawrey:嗯,它可能会也可能不会。这取决于实施。来自 Date 的文档:“一秒由 0 到 61 之间的整数表示;值 60 和 61 仅出现在闰秒中,即使这样也仅在实际正确跟踪闰秒的 Java 实现中出现。因为闰秒的方式当前引入了秒,在同一分钟内出现两个闰秒的可能性极小,但此规范遵循 ISO C 的日期和时间约定。”
【解决方案2】:

使用日历

Calendar.getInstance().get(Calendar.MILLISECOND);

Calendar c=Calendar.getInstance();
c.setTime(new Date()); /* whatever*/
//c.setTimeZone(...); if necessary
c.get(Calendar.MILLISECOND);

在实践中,虽然我认为它几乎总是等于 System.currentTimeMillis()%1000;除非有人有闰毫秒或某些日历是用不在第二边界上的纪元定义的。

【讨论】:

  • 日历默认已经是当前时间,在MILLISECOND没有s。
【解决方案3】:
Calendar.getInstance().get(Calendar.MILLISECOND);

【讨论】:

    【解决方案4】:

    tl;博士

    您要求以毫秒为单位的当前时间的几分之一秒(从纪元开始计算)。

    Instant.now()                               // Get current moment in UTC, then…
           .get( ChronoField.MILLI_OF_SECOND )  // interrogate a `TemporalField`.
    

    2017-04-25T03:01:14.113Z → 113

    1. 以纳秒(十亿)为单位获取小数秒。
    2. 除以一千将截断为毫秒(千)。

    看到这个code run live at IdeOne.com

    使用 java.time

    现代方法是使用 java.time 类。

    以 UTC 捕捉当前时刻。

    Instant.now()
    

    使用Instant.get 方法查询TemporalField 的值。在我们的例子中,我们想要的TemporalFieldChronoField.MILLI_OF_SECOND

    int millis = Instant.now().get( ChronoField.MILLI_OF_SECOND ) ;  // Get current moment in UTC, then interrogate a `TemporalField`.
    

    或者自己算算。

    您更有可能要求特定时区。几分之一秒可能与Instant 相同,但时区有很多异常,我不敢做出这样的假设。

    ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) ;
    

    询问小数秒。问题要求milliseconds,但java.time 类使用nanoseconds 的更精细分辨率。这意味着纳秒数的范围从 0 到 999,999,999。

    long nanosFractionOfSecond = zdt.getNano();
    

    如果您真的想要毫秒,请通过除以一百万来截断更精细的数据。例如,半秒是 500,000,000 纳秒,也是 500 毫秒。

    long millis = ( nanosFractionOfSecond / 1_000_000L ) ;  // Truncate nanoseconds to milliseconds, by a factor of one million.
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

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

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

    从哪里获得 java.time 类?

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

    【讨论】:

      【解决方案5】:

      我尝试了上面的几个,但它们似乎重置@1000

      这个绝对有效,还应该考虑到年份

      long millisStart = Calendar.getInstance().getTimeInMillis();
      

      然后根据需要对结束时间执行相同操作。

      【讨论】:

      • 回答错误的问题。这是从纪元开始的当前毫秒,而不是当前时间的毫秒部分。
      • 不,我确认系统和日历返回完全相同的数字:1627732708315:1627732708315
      【解决方案6】:
      1. long timeNow = System.currentTimeMillis();
      2. System.out.println(new Date(timeNow));

      2014 年 4 月 4 日星期五 14:27:05 PDT

      【讨论】:

        【解决方案7】:

        乔达时间

        我认为您可以使用Joda-Time 来执行此操作。看看DateTime 类及其getMillisOfSecond 方法。类似的东西

        int ms = new DateTime().getMillisOfSecond() ;
        

        【讨论】:

        • 编译错误:“getMillis() 具有受保护的访问权限”;需要改用get()。另请注意,new DateTime(new Date()) 等同于写简单的new DateTime()
        • 方法millisOfSecond 访问一个对象,然后对get 的进一步调用从该对象中提取一个原始int。您可以使用便捷的 getter 方法 getMillisOfSecond 折叠这两个调用。 Joda-Time 的许多属性都遵循这种模式。
        • 仅供参考,Joda-Time 项目现在位于 maintenance mode,团队建议迁移到 java.time 类。
        【解决方案8】:

        在 Java 8 中你可以简单地做

        ZonedDateTime.now().toInstant().toEpochMilli()
        

        返回: 自 1970-01-01T00:00:00Z 纪元以来的毫秒数

        【讨论】:

        • [A] 这不是问题所要求的。明确表示他们想要自纪元参考日期以来的毫秒数。 [B] 你可以通过删除 ZonedDateTime 来缩短它:Instant.now().toEpochMilli()
        【解决方案9】:

        我使用 java 8 进行了测试 构建器始终花费 0 毫秒的顺序以及 26 到 33 毫秒之间的连接以及 1000 连接的迭代的顺序无关紧要

        希望对你的 ide 有帮助

        public void count() {
        
                String result = "";
        
                StringBuilder builder = new StringBuilder();
        
                long millis1 = System.currentTimeMillis(),
                    millis2;
        
                for (int i = 0; i < 1000; i++) {
                    builder.append("hello world this is the concat vs builder test enjoy");
                }
        
                millis2 = System.currentTimeMillis();
        
                System.out.println("Diff: " + (millis2 - millis1));
        
                millis1 = System.currentTimeMillis();
        
                for (int i = 0; i < 1000; i++) {
                    result += "hello world this is the concat vs builder test enjoy";
                }
        
                millis2 = System.currentTimeMillis();
        
                System.out.println("Diff: " + (millis2 - millis1));
            }
        

        【讨论】:

          【解决方案10】:

          Java 8:

          LocalDateTime toDate = LocalDateTime.now();
          LocalDateTime fromDate = LocalDateTime.of(toDate.getYear(), toDate.getMonth(), 
          toDate.getDayOfMonth(), 0, 0, 0);
          long millis = ChronoUnit.MILLIS.between(fromDate, toDate);
          

          【讨论】:

          • 在某些时区不起作用。在某些时区,在某些日期,一天可能不是从 00:00:00 开始的。一天可能不是 24 小时,可能会增加或跳过一些小时或分钟。 LocalDateTime 类不能代表片刻,缺少任何时区概念或与 UTC 的偏移量,因此无法跟踪这些时区问题。
          【解决方案11】:

          您可以使用 java.util.Calendar 类来获取以毫秒为单位的时间。 示例:

          Calendar cal = Calendar.getInstance();
          int milliSec = cal.get(Calendar.MILLISECOND);
          // print milliSec
          
          java.util.Date date = cal.getTime();
          System.out.println("Output: " +  new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(date));
          

          【讨论】:

            猜你喜欢
            • 2012-06-23
            • 2012-08-12
            • 2018-03-11
            • 2010-11-07
            • 1970-01-01
            • 1970-01-01
            • 2012-06-12
            • 1970-01-01
            相关资源
            最近更新 更多