Java Date vs Calendar
Date is a simpler class and is mainly there for backward compatibility reasons. If you need to set particular dates or do date arithmetic, use a Calendar. Calendars also handle localization. The previous date manipulation functions of Date have since been deprecated.
Personally I tend to use either time in milliseconds as a long (or Long, as appropriate) or Calendar when there is a choice.
Both Date and Calendar are mutable, which tends to present issues when using either in an API.
The best way for new code (if your policy allows third-party code) is to use the Joda Time library.
Both, Date and Calendar, have so many design problems that neither are good solutions for new code.
Date
andCalendar
are really the same fundamental concept (both represent an instant in time and are wrappers around an underlyinglong
value).One could argue that
Calendar
is actually even more broken thanDate
is, as it seems to offer concrete facts about things like day of the week and time of day, whereas if you change itstimeZone
property, the concrete turns into blancmange! Neither objects are really useful as a store of year-month-day or time-of-day for this reason.Use
Calendar
only as a calculator which, when givenDate
andTimeZone
objects, will do calculations for you. Avoid its use for property typing in an application.Use
SimpleDateFormat
together withTimeZone
andDate
to generate display Strings.If you're feeling adventurous use Joda-Time, although it is unnecessarily complicated IMHO and is soon to be superceded by the JSR-310 date API in any event.
I have answered before that it is not difficult to roll your own
YearMonthDay
class, which usesCalendar
under the hood for date calculations. I was downvoted for the suggestion but I still believe it is a valid one because Joda-Time (and JSR-310) are really so over-complicated for most use-cases.
Date is best for storing a date object. It is the persisted one, the Serialized one ...
Calendar is best for manipulating Dates.
Note: we also sometimes favor java.lang.Long over Date, because Date is mutable and therefore not thread-safe. On a Date object, use setTime() and getTime() to switch between the two. For example, a constant Date in the application (examples: the zero 1970/01/01, or an applicative END_OF_TIME that you set to 2099/12/31 ; those are very useful to replace null values as start time and end time, especially when you persist them in the database, as SQL is so peculiar with nulls).