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

问题

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

System.currentTimeMillis()

new Date()

Calendar.getInstance().getTime()

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


#1 热门回答(207 赞)

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

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


#2 热门回答(33 赞)

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

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

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

public Date() {
    this(System.currentTimeMillis());
}

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


#3 热门回答(22 赞)

如果你使用的是约会,那么我强烈建议你使用jodatime,http://joda-time.sourceforge.net/。因为你最终会得到很多无用的代码,因此对于听起来非常糟糕的字段使用System.currentTimeMillis()

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

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

long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;