Validate ISO 8601 Date String

Benchmark created on


Setup

var dateRegex = /^(\d{4})(-(\d{2}))??(-(\d{2}))??(T(\d{2}):(\d{2})(:(\d{2}))??(\.(\d+))??(([+-]{1}\d{2}:\d{2})|Z)??)??$/;
    
    var parseDate = function(dateStr) {
                var parts = dateStr.split('T'),
                        dateParts = parts[0].split('-'),
                        timeParts = (parts[1]) ? parts[0].split(':') : undefined,
                        timeZoneOffset;
    
                if (timeParts[timeParts.length-1].indexOf('+')) {
                        timeZoneOffset = timeParts[timeParts.length-1].split('+')[1];
                }
                else if (timeParts[timeParts.length-1].indexOf('-')) {
                        timeZoneOffset = timeParts[timeParts.length-1].split('-')[1];
                }
                else {
                        timeZoneOffset = timeParts[timeParts.length-1].split('Z')[1];
                }
    
                var year = parseInt(dateParts[0], 10),
                        month = (dateParts[1]) ? parseInt(dateParts[1], 10) : 1,
                        day = (dateParts[2]) ? parseInt(dateParts[2], 10) : 1,
                        hour = (timeParts && timeParts[0]) ? parseInt(timeParts[0], 10) : 0,
                        min = (timeParts && timeParts[1]) ? parseInt(timeParts[1], 10) : 0,
                        sec = (timeParts && timeParts[2]) ? parseFloat(timeParts[2], 10) : 0;
    
                // validate year
                if (year < 1000 || month > 12 || day > 31 || hour > 23 || min > 59 || min > 59) {
                        return false;
                }
                return true;
        };

Test runner

Ready to run.

Testing in
TestOps/sec
regex
dateRegex.test('2012-08-03T12:23:12.120Z');
ready
string parse
parseDate('2012-08-03T12:23:12.120Z')
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.