Use System.currentTimeMillis() instead of Date or Calendar

http://shihabuddin.blogspot.co.nz/2007/07/use-systemcurrenttimemillis-instead-of.html

Always try to use System.currentTimeMillis() instead of java.util.Date orjava.util.Calendar.

Why?

Because of performance. Date and Calendar internally callsSystem.currentTimeMillis(). So, why not use it directly?

A BAD example:
long currentTime = Calendar.getInstance().getTimeInMillis();
So, what does Calendar.getInstance() actually do? Following lines are just copied from the source code of jdk1.5:
public static Calendar getInstance()
{
  Calendar cal = createCalendar(TimeZone.getDefaultRef(),
                                Locale.getDefault());
  cal.sharedZone = true;
  return cal;
}

private static Calendar createCalendar(TimeZone zone,
                                       Locale aLocale)
{
  if ("th".equals(aLocale.getLanguage()) &&
      ("TH".equals(aLocale.getCountry()))) {
    return new sun.util.BuddhistCalendar(zone, aLocale);
  }
  return new GregorianCalendar(zone, aLocale);
}

public GregorianCalendar(TimeZone zone, Locale aLocale) {
  super(zone, aLocale);
  gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
  setTimeInMillis(System.currentTimeMillis());
}
Have you got it? Calendar.getInstance() checks TimeZoneLocale and of course System.currentTimeMillis(). So, it's an expensive operation.

Another bad example:
Date date = new Date(System.currentTimeMillis());
Why is it bad? Because, it should be as simple as:
Date date = new Date();
And, here is the apidoc of default constructor of Date:
Allocates a Date object and initializes it so that
it represents the time at which it was allocated,
measured to the nearest millisecond.
Yet, another bad example:
Date date = Calendar.getInstance().getTime();
Now, when should we use System.currentTimeMillis():
When we need only the millisecond representation of the current time.

When should we use Date: When we need a date object representing the current time.

When should we use Calendar.getInstance(): When we need TimeZone orLocale specific information. Another use of Calender can be for creating constant Date object:
public static final Date INDEPENDENCE_DAY;

static {
  Calendar calendar = Calendar.getInstance();
  calendar.set(1971, Calendar.MARCH, 26);
  INDEPENDENCE_DAY = calendar.getTime();
}

Comments

Popular posts from this blog

Why Enum Singleton are better in Java