【Java基础】new Date().getTime()和System.currentTimeMillis()获取时间戳的比较

简介: new Date().getTime()和System.currentTimeMillis()获取时间戳的比较

最近在优化项目代码,看项目组的代码时,发现了一个有趣的现象,有使用new Date().getTime()来获取时间戳的, 也有使用System.currentTimeMillis()来获取时间戳的,这让我想到,好像我平时写代码也是想起哪种方式就用什么方式写。这两种方式都可以,仔细思考一下,两者应该会有区别的,应该有是最优的方式?


然后就看了看源码,其实解决疑惑最优方式就是看源码,打开java.util.Date的源码可以发现,无参构造函数如下:

/*** Allocates a <code>Date</code> object and initializes it so that* it represents the time at which it was allocated, measured to the* nearest millisecond.** @see     java.lang.System#currentTimeMillis()*/publicDate() {
this(System.currentTimeMillis());
    }
/*** Allocates a <code>Date</code> object and initializes it to* represent the specified number of milliseconds since the* standard base time known as "the epoch", namely January 1,* 1970, 00:00:00 GMT.** @param   date   the milliseconds since January 1, 1970, 00:00:00 GMT.* @see     java.lang.System#currentTimeMillis()*/publicDate(longdate) {
fastTime=date;
    }

从源码可以看出,new Date().getTime()其实就是在无参构造里调用了System.currentTimeMillis(),再传入自己的有参构造函数。不难看出,如果只是仅仅获取时间戳,即使是匿名的new Date()对象也会有些许的性能消耗, 从性能提升的角度来看,如果只是仅仅获取时间戳,不考虑时区的影响(时区为什么会有影响),直接调用System.currentTimeMillis()会更好一些。


再来看看System.currentTimeMillis()的源码:

/*** Returns the current time in milliseconds.  Note that* while the unit of time of the return value is a millisecond,* the granularity of the value depends on the underlying* operating system and may be larger.  For example, many* operating systems measure time in units of tens of* milliseconds.** <p> See the description of the class <code>Date</code> for* a discussion of slight discrepancies that may arise between* "computer time" and coordinated universal time (UTC).** @return  the difference, measured in milliseconds, between*          the current time and midnight, January 1, 1970 UTC.* @see     java.util.Date*/publicstaticnativelongcurrentTimeMillis();

这是一个本地方法,其时间来源依赖由操作系统为其做了时区的处理,因此获取时间戳,不需要考虑时区的前提下,它是最优选择。


其实, java.util.Date设计来作为格式化时间,以面向对象的方式获取与时间有关的各方面信息,例如:获取年月份、小时、分钟等等比较丰富的信息。而new Date()来获取当前时间更多的是因为我们使用习惯导致经常第一时间想到用它来获取当前时间。

 

扩展:关于获取时间戳另一种方式:

在Java中,还可能见到另外一种获取时间的方式:

Calendar.getInstance().getTimeInMillis()

其实这种方式是速度最慢的,看其源码就会发现,Canlendar是区分时区的,因为要处理时区问题会耗费很多的时间。


本文首发于CSDN,为博主原创文章,如果需要转载,请注明出处,谢谢!


完结!

相关文章
|
4月前
|
Java
【Java基础面试三十二】、new String(“abc“) 是去了哪里,仅仅是在堆里面吗?
这篇文章解释了Java中使用`new String("abc")`时,JVM会将字符串直接量"abc"存入常量池,并在堆内存中创建一个新的String对象,该对象会指向常量池中的字符串直接量。
|
3月前
|
Java API 调度
掌握Java线程状态:从NEW到TERMINATED
本文探讨了操作系统与Java中线程的状态及其转换。操作系统层面,线程状态包括初始、就绪、运行、阻塞和终止。Java线程状态则细分为NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,并详细介绍了各状态的特性和转换条件。此外,还列举了Java中常用的线程方法,如`wait()`、`notify()`、`start()`和`join()`等,帮助理解线程控制机制。
133 3
掌握Java线程状态:从NEW到TERMINATED
|
3月前
|
安全 Java API
时间日期API(Date,SimpleDateFormat,Calendar)+java8新增日期API (LocalTime,LocalDate,LocalDateTime)
这篇文章介绍了Java中处理日期和时间的API,包括旧的日期API(Date、SimpleDateFormat、Calendar)和Java 8引入的新日期API(LocalTime、LocalDate、LocalDateTime)。文章详细解释了这些类/接口的方法和用途,并通过代码示例展示了如何使用它们。此外,还讨论了新旧API的区别,新API的不可变性和线程安全性,以及它们提供的操作日期时间的灵活性和简洁性。
|
3月前
|
Java API
Java时间戳教程
本文详细介绍Java中时间戳的处理方法,包括获取当前时间戳、使用`java.time`包、时间戳与日期的相互转换及格式化等。示例代码展示了如何利用`System.currentTimeMillis()`和`java.time.Instant`获取时间戳,以及如何通过`Date`和`ZonedDateTime`进行日期转换和时区处理。随着Java 8引入的`java.time`包,日期时间操作变得更加强大和便捷,推荐在新项目中优先采用。
241 8
|
2月前
|
Java
Java的Date类使用
Java的Date类使用
27 0
|
3月前
|
Java API
java date 增加10s后的时间
在 Java 中,要将 `Date` 对象增加 10 秒,可以通过 `Calendar` 类(适用于 Java 8 之前)或 `java.time` 包中的 `LocalDateTime`、`ZonedDateTime` 和 `Instant` 类(Java 8 及以上)实现。使用 `Calendar` 类时,需设置并修改 `Calendar` 实例。而在 `java.time` 包中,可以使用 `plus` 方法结合 `ChronoUnit.SECONDS` 来增加秒数。具体选择取决于是否需要处理时区以及 Java 版本。
132 1
|
4月前
|
Java
【Java基础面试二十八】、使用字符串时,new和““推荐使用哪种方式?
这篇文章讨论了在Java中使用字符串时,推荐使用双引号`""`直接量方式而不是使用`new`操作符,因为`new`会在常量池之外额外创建一个对象,导致更多的内存占用。
|
5月前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
73 3
|
5月前
|
Java 数据库
使用java.sql.Timestamp处理时间戳
使用java.sql.Timestamp处理时间戳
|
6月前
|
安全 Java 测试技术
滚雪球学Java(51):掌握Java Date类:用法、弊端与时间戳转换技巧,助你轻松处理日期时间
【6月更文挑战第5天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
101 0
滚雪球学Java(51):掌握Java Date类:用法、弊端与时间戳转换技巧,助你轻松处理日期时间