System.currentTimeMillis()与new Date()与Calendar.getInstance().getTime()

Vih*_*ung 230 java performance time calendar date

在Java中,使用的性能和资源含义是什么

System.currentTimeMillis() 
Run Code Online (Sandbox Code Playgroud)

new Date() 
Run Code Online (Sandbox Code Playgroud)

Calendar.getInstance().getTime()
Run Code Online (Sandbox Code Playgroud)

据我了解,System.currentTimeMillis()是最有效的.但是,在大多数应用程序中,需要将该长值转换为Date或某些类似对象,以对人类执行任何有意义的操作.

Mic*_*rdt 235

System.currentTimeMillis()显然是最有效的,因为它甚至没有创建一个对象,但new Date()实际上只是一个很长的薄包装,所以它不会落后.Calendar另一方面,它相对缓慢而且非常复杂,因为它必须处理日期和时间(闰年,夏令时,时区等)固有的相当复杂和所有奇怪的问题.

通常最好只处理Date应用程序中的长时间戳或对象,并且仅Calendar在实际需要执行日期/时间计算时使用,或者将日期格式设置为显示给用户.如果你必须做很多这样的事情,那么使用Joda Time可能是一个好主意,因为它具有更清晰的界面和更好的性能.

  • timestamp和currentMillis有什么区别? (2认同)
  • @pinkpanther:“时间戳”通常用于描述一个整数/长整数,当解释为“纪元开始”以来的秒数或毫秒数时,它描述了一个时间点。换句话说, currentTimeMillis() 返回一个时间戳。 (2认同)

Esk*_*sko 42

看看JDK,最里面的构造函数Calendar.getInstance()有:

public GregorianCalendar(TimeZone zone, Locale aLocale) {
    super(zone, aLocale);
    gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
    setTimeInMillis(System.currentTimeMillis());
}
Run Code Online (Sandbox Code Playgroud)

所以它已经自动完成了你的建议.Date的默认构造函数包含:

public Date() {
    this(System.currentTimeMillis());
}
Run Code Online (Sandbox Code Playgroud)

所以真的不需要专门获得系统时间,除非你想在用它创建Calendar/Date对象之前用它做一些数学运算.另外,如果您的目的是大量使用日期计算,我必须建议使用joda-time作为Java自己的日历/日期类的替代品.


kro*_*old 22

如果您正在使用约会,那么我强烈建议您使用jodatime,http: //joda-time.sourceforge.net/ .使用System.currentTimeMillis()该字段日期听起来像一个非常糟糕的主意,因为你有很多无用的代码而告终.

日期和日历都严重受挫,而日历绝对是他们所有人中表现最差的.

我建议你System.currentTimeMillis()在实际操作毫秒时使用,例如像这样

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;
Run Code Online (Sandbox Code Playgroud)

  • 我想对此发表评论,因为你的例子正是你应该*不*使用System.currentTimeMillis()的事情之一; 它不是单调时钟源,因此您无法使用它可靠地计算经过的时间.如果在您正在执行的代码执行时更改系统时钟,您将得到奇怪的(例如负数)结果.而不是使用System.nanoTime(),**是*monotonic*if*底层系统支持这样的时钟源(参见http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6458294) (28认同)

Bom*_*mbe 12

我更喜欢使用返回的值System.currentTimeMillis()进行各种计算,只使用Calendar或者Date我需要真正显示人类读取的值.这也可以防止99%的夏令时错误.:)


Puz*_*rki 12

在我的机器上,我试过检查它.我的结果:

Calendar.getInstance().getTime() (*1000000 times) = 402ms
new Date().getTime(); (*1000000 times) = 18ms
System.currentTimeMillis() (*1000000 times) = 16ms

不要忘记GC(如果你使用Calendar.getInstance()new Date())

  • 想知道如果许多线程在其他处理之间调用相同的函数是否会有任何差异 (2认同)

Myk*_*naC 7

根据您的应用程序,您可能需要考虑使用System.nanoTime().

  • 这可能是最晚的,问题中的所有例子都有一个绝对概念,例如它是什么时候.自Unix时代开始以来1,348,770,313,071毫秒."nanoTime"返回的时间是相对的(通常是程序的开头),如果你试图将它变成日期,那将是无稽之谈. (4认同)