Answers:
System.currentTimeMillis()
显然,它是最有效的,因为它甚至不创建任何对象,但new Date()
实际上只是一个很长的薄包装,因此紧随其后。Calendar
另一方面,它相对较慢且非常复杂,因为它必须处理日期和时间固有的相当大的复杂性和所有奇数(ap年,夏时制,时区等)。
通常,最好只处理Date
应用程序中的较长时间戳或对象,并且仅Calendar
在实际需要执行日期/时间计算或格式化日期以将其显示给用户时使用,才是一个好主意。如果您需要执行很多操作,则使用Joda Time可能是一个好主意,因为它具有更干净的界面和更好的性能。
查看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自己的日历/日期类。
如果您要使用日期,则强烈建议您使用http://joda-time.sourceforge.net/的 jodatime 。使用System.currentTimeMillis()
该场是像一个非常糟糕的主意日期的声音,因为你有很多无用的代码而告终。
日期和日历都严重地令人厌烦,日历绝对是其中表现最差的。
我建议您System.currentTimeMillis()
在实际以毫秒为单位进行操作时使用,例如这样
long start = System.currentTimeMillis();
.... do something ...
long elapsed = System.currentTimeMillis() -start;
在我的机器上,我尝试检查它。我的结果:
Calendar.getInstance()。getTime()(* 1000000次)= 402ms 新的Date()。getTime(); (* 1000000次)= 18ms System.currentTimeMillis()(* 1000000次)= 16ms
不要忘了GC(如果您使用Calendar.getInstance()
或new Date()
)
根据您的应用程序,您可能需要考虑System.nanoTime()
改为使用。
nanoTime
返回的时间是相对的(通常是相对于程序的开始),如果您尝试将其转换为日期,那将是无稽之谈。
我尝试了这个:
long now = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
new Date().getTime();
}
long result = System.currentTimeMillis() - now;
System.out.println("Date(): " + result);
now = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
System.currentTimeMillis();
}
result = System.currentTimeMillis() - now;
System.out.println("currentTimeMillis(): " + result);
结果是:
Date():199
currentTimeMillis():3
System.currentTimeMillis()
显然是最快的,因为它只是一个方法调用,不需要垃圾收集器。