Подтвердить что ты не робот

Javascript date parsing on Iphone

Я работаю над автономным сайтом Javascript, который предназначен для мобильных устройств. Одним из таких мобильных устройств является IPhone.

Я пытаюсь проанализировать дату из нашего REST API (члена объекта JSON). Я использую

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

Это работает на устройствах Android, однако на IPhone он просто дает недопустимую дату.

Как мне отформатировать строку даты, чтобы ее можно было проанализировать с помощью IPhone?

4b9b3361

Ответ 1

Не все браузеры поддерживают одинаковые форматы даты. Наилучший подход состоит в том, чтобы разбить строку на разделительные символы (-,   и :) и передать каждый из полученных элементов массива в конструктор Date:

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)

Это будет работать одинаково во всех браузерах.

Ответ 2

Для времени UTC/GMT вы можете попробовать:

    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]);

Объект даты будет отображаться в соответствующем локальном часовом поясе при использовании.

Ответ 3

Вам может быть повезло, если вы придерживаетесь формата ISO 8601:

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)

Ответ 4

Обновление 2019-07-29: Не удаляйте существующий контент ниже, но я настоятельно рекомендую вам не использовать этот метод. Я учился на своих ошибках. Не переопределяйте существующие методы JavaScript. Становится плохо для переносимости вашего кода и производительности. Если вы не можете получить ISO 8601 (что является стандартной практикой в JS и большинстве API) - измените эту систему. В качестве альтернативы напишите свою собственную функцию, которая всегда должна вызываться для создания объекта Date.


Если вы можете исправить свой REST API так, чтобы он отправлял правильное время даты ISO 8601, то правильный способ справиться с этим - использовать регулярное выражение, которое позволяет всем браузерам обрабатывать даты ISO 8601. Конечно, это может быть медленнее, но работать с датами с помощью Javascript - это все равно, что пытаться посадить кота в воду.

Имейте в виду, что следующий метод переопределяет оригинальный метод Date.parse. Это может быть проблематично в больших проектах или со многими разработчиками с разными ожиданиями. Используйте, только если вы знаете, что делаете.

/**
 * 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 thats 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