关于java:System.currentTimeMillis()与new Date()与Calendar.getInstance()。getTime()

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

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

1
System.currentTimeMillis()

1
new Date()

1
Calendar.getInstance().getTime()

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


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

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


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

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

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

1
2
3
public Date() {
    this(System.currentTimeMillis());
}

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


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

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

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

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


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

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

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


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


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


我试过这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        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);

结果是:

日期():199

currentTimeMillis():3


System.currentTimeMillis()显然是最快的,因为它只有一个方法调用,不需要垃圾收集器。