Javascript date parsing on Iphone

30,191

Solution 1

Not all browsers support the same date formats. The best approach is to split the string on the separator characters (-,   and :) instead, and pass each of the resulting array items to the Date constructor:

var arr = "2010-03-15 10:30:00".split(/[- :]/),
    date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]);

console.log(date);
//-> Mon Mar 15 2010 10:30:00 GMT+0000 (GMT Standard Time)

This will work the same in all browsers.

Solution 2

For UTC/GMT time, you can try:

    var arr = "2014-10-27T16:05:44+0000".split(/[\-\+ :T]/);

    var date = new Date();
    date.setUTCFullYear(arr[0]);
    date.setUTCMonth(arr[1] - 1);
    date.setUTCDate(arr[2]);
    date.setUTCHours(arr[3]);
    date.setUTCMinutes(arr[4]);
    date.setUTCSeconds(arr[5]);

The date object will display in the proper local timezone when used.

Solution 3

You might have better luck if you stick to ISO 8601 format:

Date.parse("2010-03-15T10:30:00");

// e.g.
var d = new Date( Date.parse("2010-03-15T10:30:00") );
console.log( d.toString() ); //Mon Mar 15 2010 10:30:00 GMT+0000 (BST)

Solution 4

Update 2019-07-29: Not removing existing content below, but I highly suggest you don't use this method. I learned from my mistakes. Do not override JavaScript's existing methods. Becomes bad for your code's portability and performance. If you can't get ISO 8601 (which is standard practice in JS and most API's) - then change that system instead. Alternatively, write your own function, which always has to be called to generate a Date object.


If you can correct your REST API to send down proper ISO 8601 date times, the proper way to handle this is to use a regex shim that allows all browsers to process ISO 8601 dates. Sure it might be slower, but handling dates with Javascript is like trying to get a cat into a tub of water.

Keep in mind the following method overrides the original Date.parse method. This could be problematic in larger projects or with many developers with different expectations. Use only if you're aware of what you're doing.

/**
 * Date.parse with progressive enhancement for ISO 8601 <https://github.com/csnover/js-iso8601>
 * © 2011 Colin Snover <http://zetafleet.com>
 * Released under MIT license.
 */
(function (Date, undefined) {
    var origParse = Date.parse, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ];
    Date.parse = function (date) {
        var timestamp, struct, minutesOffset = 0;

        // ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string
        // before falling back to any implementation-specific date parsing, so that’s what we do, even if native
        // implementations could be faster
        //              1 YYYY                2 MM       3 DD           4 HH    5 mm       6 ss        7 msec        8 Z 9 ±    10 tzHH    11 tzmm
        if ((struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(date))) {
            // avoid NaN timestamps caused by “undefined” values being passed to Date.UTC
            for (var i = 0, k; (k = numericKeys[i]); ++i) {
                struct[k] = +struct[k] || 0;
            }

            // allow undefined days and months
            struct[2] = (+struct[2] || 1) - 1;
            struct[3] = +struct[3] || 1;

            if (struct[8] !== 'Z' && struct[9] !== undefined) {
                minutesOffset = struct[10] * 60 + struct[11];

                if (struct[9] === '+') {
                    minutesOffset = 0 - minutesOffset;
                }
            }

            timestamp = Date.UTC(struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7]);
        }
        else {
            timestamp = origParse ? origParse(date) : NaN;
        }

        return timestamp;
    };
}(Date));

https://github.com/csnover/js-iso8601

Share:
30,191
Morten
Author by

Morten

I’m Morten Nielsen. Ive studied at KTH – Royal Institute of Technology in Stockholm, where I achieved my Master degree in Computer Science. The Swedish title is Civilingenjör. I focused my studies on distributed, parallel programming and general Computer Science. My master thesis was about creating a concurrent search algorithm for Gecode searching for a solution in a constraint programming binary tree. Unfortunately Gecode never started to use my concurrent search engine in production. I enjoy discrete mathematics and statistics, but mostly I work primarily with software design. I have a deep interest in Software Design, and strive to achieve SOLID Object-oriented and simple solutions. I’m currently working at RemoteX Technologies in Stockholm Sweden. Where I am one of two lead developers for their new product RemoteX Applications. RemoteX Applications is a distributed field service management system, running on Windows Mobile phones and Windows based clients. When Steve Balmer was in Stockholm in 2008 we were invited to be one of the key speakers at the event, based on our work on RemoteX Applications.

Updated on August 01, 2021

Comments

  • Morten
    Morten almost 3 years

    I'm working on an offline capabable Javascript site that targets mobile devices. One such mobile device is the IPhone.

    I'm trying to parse a date from our REST API (a member of JSON object). I'm using

    Date.parse("2010-03-15 10:30:00");
    

    This works on Android devices, however on IPhone it just gives an invalid date.

    How do I need to format my date string so it can be parsed by the IPhone?