System.currentTimeMillis() uptimeMillis() elapsedRealtime() 区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了System.currentTimeMillis() uptimeMillis() elapsedRealtime() 区别相关的知识,希望对你有一定的参考价值。

参考技术A System.currentTimeMillis() 系统时间,也就是日期时间,可以被系统设置修改,然后值就会发生跳变。
uptimeMillis 自开机后,经过的时间,不包括深度睡眠的时间
elapsedRealtime自开机后,经过的时间,包括深度睡眠的时间

所以System.currentTimeMillis()不适合计算时间间隔,eg,
now = System.currentTimeMillis()
//do something...
duration = System.currentTimeMillis() -now;

如果在do something的时候,改变了系统时间,那么 获取duration就不准了。通常在比较小的时间里,(毫秒级,秒级)一般不会有什么问题,系统时间可能不会改变。但是如果时间很长的话,那就保证不了了

uptimeMillis由于不计算睡眠时间,所以非常适合做一些特殊的时间间隔计算
elapsedRealtime 包括睡眠时间,适用于任何情况下的时间间隔计算

给定日期的 System.currentTimeMillis()? [复制]

【中文标题】给定日期的 System.currentTimeMillis()? [复制]【英文标题】:System.currentTimeMillis() for a given date? [duplicate] 【发布时间】:2010-10-12 14:01:56 【问题描述】:

由于 java.util.Date 大部分已被弃用,获取给定日期(UTC 时间)的时间戳的正确方法是什么?可以与System.currentTimeMillis() 比较的那个。

【问题讨论】:

请注意:麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleTextFormat,现在是 legacy,被 java.time 类所取代。 【参考方案1】:

使用Calendar 类,您可以在特定时区的特定时间创建时间戳。一旦你有了它,你就可以得到毫秒时间戳来比较:

Calendar cal = new GregorianCalendar();
cal.set(Calendar.DAY_OF_MONTH, 10);
// etc...

if (System.currentTimeMillis() < cal.getTimeInMillis()) 
  // do your stuff

编辑:更改为使用更直接的方法从日历实例获取时间(以毫秒为单位)。感谢非法程序员

【讨论】:

Calendar 实际上有一个 getTimeInMillis() 方法,它比 getTime().getTime() 更直接一点。无论如何 +1。【参考方案2】:

虽然我自己没有尝试过,但如果您的项目允许外部库,我相信您应该看看 JODA-Time 项目(开源)。 AFAIK,JODA 时间为日期/时间的新 JSR(通常在 Java7 中)做出了很大贡献。

许多人声称 JODA 时间是所有 java.util.Date/Calendar 问题的解决方案;-)

绝对值得一试。

【讨论】:

我还建议查看 JODA-Time - 当前的 java.util.Date 和 Calendar 在很多方面都非常糟糕(在 JODA 页面上,有关于为什么首先创建 JODA 项目的励志故事)。【参考方案3】:

很多东西的“官方”替代日期是日历。不幸的是,它相当笨拙且设计过度。你的问题可以这样解决:

long currentMillis = System.currentTimeMillis();
Date date = new Date(currentMillis);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
long calendarMillis = calendar.getTimeInMillis();
assert currentMillis == calendarMillis;

日历也可以用不同的方式初始化,甚至一次初始化一个字段(小时、分钟、秒等)。看看 Javadoc。

【讨论】:

【参考方案4】:

看看Calendar 类。

您可以使用当前时间(未弃用)制作数据,然后从中制作日历(还有其他方法)。

【讨论】:

以上是关于System.currentTimeMillis() uptimeMillis() elapsedRealtime() 区别的主要内容,如果未能解决你的问题,请参考以下文章

System.currentTimeMillis() 是不是返回 UTC 时间?

给定日期的 System.currentTimeMillis()? [复制]

System.nanoTime()和System.currentTimeMillis()性能问题

System.currentTimeMillis()

System.currentTimeMillis() uptimeMillis() elapsedRealtime() 区别

System.currentTimeMillis()和new Date().getTime()比较