Вопрос по javascript, jquery, date – Преобразовать метку времени ISO в формат даты с помощью Javascript?

13

Это кажется довольно простым вопросом, но я не могу получить ответ на него. Как я могу конвертировать временную метку ISO для отображения даты / времени с помощью JavaScript?

Пример отметки времени: 2012-04-15T18: 06: 08-07: 00

Любая помощь приветствуется, Google подводит меня. Спасибо.

Ваша метка времени ISO у вас есть строка? и вы хотите разобрать его в JavaScriptDate() учебный класс? jfriend00
Временная метка Unix и временная метка ISO не являются одинаковыми, так что нет, это не дубликат. Ian
Возможный дупstackoverflow.com/questions/847185/… elclanrs
jfriend00, я поставил пример временной метки там вверх 2012-04-15T18: 06: 08-07: 00. Это именно то, что я и хочу сделать, я просто хочу взять эту временную метку, запустить ее через javascript и вернуть ее в формате даты. (эта временная метка фактически не преобразуется в это). Однако я не смог понять, как это сделать с помощью отметки времени iso. Я знаю, как сделать это в PHP, но я хочу сделать это в JavaScript, чтобы он был относительно часового пояса пользователя. Ian

Ваш Ответ

3   ответа
4

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

var jsDate = new Date("2012-04-15T18:06:08-07:00");

Но более старые браузеры (любая версия IE до IE9, любая версия Firefox до 4 и т. Д.) Не поддерживают это. Для этих браузеров вы можете получить библиотеку, которая может сделать это для вас, какdatejs или разбери сам как то так

var t = "2012-04-15T18:06:08-07:00";

function convertDate(t) {
    var dateRE = /(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)([+\-]\d+):(\d+)/;
    var match = t.match(dateRE);
    var nums = [], item, date;
    if (match) {
        for (var i = 1; i < match.length; i++) {
            nums.push(parseInt(match[i], 10));
        }
        if (nums[7] < 0) {
            nums[8] *= -1;
        }
        return(new Date(nums[0], nums[1] - 1, nums[2], nums[3] - nums[6], nums[4] - nums[7], nums[5]));
    }
}

var jsDate = convertDate(t);

Рабочая демоверсия здесь:http://jsfiddle.net/jfriend00/QSgn6/

2012-05-28T02: 47: 59Z
он не работает для этой строки "2012-04-15T18: 06: 08-07: 00"
0

Это лучшее, что я когда-либо видел, он может использовать часовой пояс клиента на рабочем столе и изменяется в реальном времени с настройкой часового пояса:

<script type="text/javascript">
    //Use: timeZoneConvert("2015-11-03T17:36:20.970");
    //Mon Nov 02 2015 17:36:20 GMT-0600 (Central Standard Time)  [Date object]

    //To format string use: timeZoneConvertFormatted("2015-11-03T17:36:20.970")
    //November 2, 2015 5:36 PM

    //Works even when I change client timezone to Pacific Standard
    //Mon Nov 02 2015 15:36:20 GMT-0800 (Pacific Standard Time)



var months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
function timeZoneConvert(dateStr) {
    var d = parse_iso8601(dateStr);
    //Change (- 360) constant for your server, mine is Central Standard
    var dTimezoneOffset = new Date(d.getTime() - ((new Date()).getTimezoneOffset() - 360)*60000);
    return dTimezoneOffset;
}   

function timeZoneConvertFormatted(dateStr) {
    return fDateTime(timeZoneConvert(dateStr));
}   


function fDateTime(date1) {
    var date = date1.getDate();
    var year = date1.getFullYear();
    var month = months[date1.getMonth() + 1];
    var h = date1.getHours();
    var m = date1.getMinutes();
    var ampm = "AM";
    if(m < 10) {
        m = "0" + m;
    }
    if(h > 12) {
        h = h - 12;
        var ampm = "PM";
    }
    return month + " " + date + ", " + year + " " + h + ":" + m + " " + ampm;
}



    var iso8601extended = /^\d{4}(-\d{2}(-\d{2}([T ]\d{2}(:\d{2}(:\d{2})?)?([,.]\d+)?(Z|[+-]\d{2}(:\d{2})?)?)?)?)?$/;
    var iso8601basic = new RegExp(iso8601extended.source.replace(/[:-]\\d/g, '\\d'));
    var firstNumber = /[^\d]*(\d+)/g;
    function parse_iso8601(s) {
        s = s.replace(/,/g, '.');
        var matches = iso8601extended.exec(s);
        if (matches) {
            s = s.substr(0, 10).replace(/-/g, '') + s.substr(10).replace(/:/g, '');
        }
        matches = iso8601basic.exec(s);
        if (!matches) {
            return null;
        }
        var d = new Date();
        d.setUTCFullYear(toNumber(matches[0].substring(0, 4)));
        d.setUTCMonth(matches[1] ? toNumber(matches[1].substr(0, 2)) - 1 : 0);
        d.setUTCDate(matches[2] ? toNumber(matches[2].substr(0, 2)) : 1);
        var hours = 0, minutes = 0, seconds = 0, milliseconds = 0;
        var fraction = matches[6] ? parseFloat(matches[6]) : 0;
        if (matches[3]) {
            hours = toNumber(matches[3].substr(1, 2));
            if (matches[4]) {
                minutes = toNumber(matches[4].substr(0, 2));
                if (matches[5]) {
                    seconds = toNumber(matches[5].substr(0, 2));
                    milliseconds = 1000 * fraction;
                } else {
                    seconds = 60 * fraction;
                }
            } else {
                minutes = 60 * fraction;
            }
        }
        if (!matches[7]) {
            d.setHours(hours);
            d.setMinutes(minutes);
        } else {
            d.setUTCHours(hours);
            d.setUTCMinutes(minutes);
        }
        d.setUTCSeconds(seconds);
        d.setUTCMilliseconds(milliseconds);
        if (matches[7] && matches[7] != 'Z') {
            offset = toNumber(matches[7].substr(1, 2)) * 60;
            if (matches[8]) {
                 offset += toNumber(matches[8].substr(0, 2));
            }
            d.setTime(d.getTime() + 60000 * offset * (matches[7].substr(0, 1) == '-' ? 1 : -1));
        }
        return d;
    }
    function toNumber(s) {
        return parseInt(s.replace(/^0+(\d)/, '$1'));
    }
</script>
27

Передайте его конструктору Date.

> var date = new Date('2012-04-15T18:06:08-07:00')
> date
  Mon Apr 16 2012 04:06:08 GMT+0300 (EEST)

Для получения дополнительной информации о дате, проверьтеhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date.

Ну, это было значительно проще, чем я думал ... спасибо Ian
Это не работает ни в одной версии IE до IE9 или версий Firefox до Firefox 4.
Действительно, синтаксический анализ дат ISO является частью поддержки EcmaScript 5. Если вам нужно работать со старыми браузерами, вам лучше использовать что-то вроде приведенного ниже кода.

Похожие вопросы