2.9 Creating a Date Object

NN 2, IE 3

2.9.1 Problem

You want to create an instance of a Date object to use for date calculations or display.

2.9.2 Solution

Use the Date object constructor method with any of the acceptable arguments signifying a date (and, optionally, a time for that date):

var myDate = new Date(yyyy, mm, dd, hh, mm, ss);
var myDate = new Date(yyyy, mm, dd);
var myDate = new Date("monthName dd, yyyy hh:mm:ss");
var myDate = new Date("monthName dd, yyyy");
var myDate = new Date(epochMilliseconds);

With all of these constructions, you can generate a date object for any point in history (reliably back to approximately 100 A.D.) or the future (thousands of millennia hence). When you create a date object without specifying the time, all time values are automatically set to zerothe very start of that day.

To create a date object with the current date and time, omit all arguments:

var now = new Date( );

The accuracy of the value assigned by the Date object constructor is entirely dependent upon the accuracy of the client computer's internal clock, control panel settings, and occasional browser anomalies. Correct setting of the computer's local time zone and daylight saving time option is essential to accurate date and time calculations based on the current date.

2.9.3 Discussion

Notice that the arguments for the Date object constructoras specified in the ECMAScript standardhave no variation that readily accepts shortcut ways of entering dates (such as mm/dd/yyyy, or the numerous variations used around the world). Instead, numerical entries need to be broken into the component parts to be passed as discrete arguments for the constructor. If you need to generate a date object from user entries in a text box (or, better still, a series of three text boxes), you can pass the value properties of those text boxes directly as arguments of the constructor:

var dateEntry = new Date(document.myForm.year.value, 

This is one of those many places where the JavaScript engine automatically attempts to cast a string value to the required number value.

Despite the lack of formal support for entry in formats such as mm/dd/yyyy or mm-dd-yyyy, browsers support them. Therefore, you can get away with supplying one of those formats to a constructor method, but remember that the sequence is only assured to work in browsers and operating systems whose date formats support that sequence. A North American browser, for instance, will misinterpret dates formatted as dd/mm/yyyy, which is a very common format outside North America.

It's important to remember that all of this date object creation and manipulation occurs strictly on the client. A client-side date object has no connection with the server's clock or time zone. At best, a server can timestamp a page as it leaves the server, but that has nothing to do with a date object on the client. Any attempt at synchronizing a client-side date object with the server clock is doomed due to latency between the serving of the page and the rendering in the client.

You are encouraged to restrict mission-critical date manipulation scripts to IE 4 or later and Navigator 4 or later. Earlier browsers contained numerous Date object bugs, especially in the area of time zone calculations.

2.9.4 See Also

Recipes 2.10 and Recipe 2.11 for date calculations; Recipe 2.12 for using regular expressions to validate date entries in a form; Recipe 15.7 and Recipe 15.8 for applications of a date object in showing much time is left before a future event.