Существует ли плагин JQuery для преобразования времени UTC в часовой пояс местного пользователя? - PullRequest
20 голосов
/ 30 сентября 2010

Если у меня есть тег:

<span class="utctime">2010-01-01 11:30 PM</span>

Я бы хотел, чтобы скрипт jquery или плагин преобразовывали каждый класс utctime в местное время браузера текущего пользователя. Я предпочел бы найти это, прежде чем писать.

Ответы [ 5 ]

17 голосов
/ 30 сентября 2010

Хорошо, поэтому я создал тот, который делает это:

/*
    Note: this requires that the JQuery-DateFormat plugin (available here) be loaded first
    http://plugins.jquery.com/project/jquery-dateFormat
*/

(function ($) {
    $.fn.localTimeFromUTC = function (format) {

        return this.each(function () {

            // get time offset from browser
            var currentDate = new Date();
            var offset = -(currentDate.getTimezoneOffset() / 60);

            // get provided date
            var tagText = $(this).html();
            var givenDate = new Date(tagText);

            // apply offset
            var hours = givenDate.getHours();
            hours += offset;
            givenDate.setHours(hours);

            // format the date
            var localDateString = $.format.date(givenDate, format);
            $(this).html(localDateString);
        });
    };
})(jQuery);

Использование:

    <span class="utcdate">2/5/2010 10:30 PM</span>

    $('.utcdate').localTimeFromUTC('MM/dd/yyyy hh:mm a');
7 голосов
/ 02 декабря 2011

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

(function ($) {
$.fn.localTimeFromUTC = function (format) {
    return this.each(function () {

        // get provided date 
        var tagText = $(this).html();
        var givenDate = new Date(tagText);

        if(givenDate == 'NaN') return;

        // get time offset from browser 
        var offset = -(givenDate.getTimezoneOffset() / 60);

        // apply offset 
        var hours = givenDate.getHours();
        hours += offset;
        givenDate.setHours(hours);

        // format the date 
        var localDateString = $.format.date(givenDate, format);
        $(this).html(localDateString);


    });
};
})(jQuery); 

Используйте это как ....

function ConvertDatesToLocalTime() {
        $('.ConvertUtcToLocal').localTimeFromUTC('MM/dd/yyyy hh:mm:ss a');
    }

    $(document).ready(function () {
        ConvertDatesToLocalTime();

    });

Назначьте класс 'ConvertUtcToLocal' всем элементам, требующим преобразования.

1 голос
/ 11 января 2012
$(".localdatetime").each(function () {
        var datestr = $(this).text();
        //alert(datestr);
        if (datestr.trim() != '') {
            var dateOb = (new Date(Date.parse(datestr, 'MM-dd-yyyy HH:mm'))).setTimezone("GMT").toString('dd MMM yyyy hh:mm tt');
            //alert(dateOb);
            $(this).text(dateOb);
        }
    })

это также можно использовать вместе с библиотекой Date.js для отображения времени в часовом поясе пользователя

0 голосов
/ 26 октября 2011

Когда я использовал это, мне пришлось изменить строку

var hours = givenDate.getHours();

до

var hours = givenDate.getUTCHours();

При отладке через эту строку строка var givenDate = new Date(tagText) заканчивается созданием объекта Date в формате UTC (если вы задаете ему дату в формате RFC1123, например, ddd, dd MMM yyyy HH:mm:ss GMT), но при вызове getHours вы получаете часы в местном часовом поясе. Так что, если вы не позвоните getUTCHours, это не сработает.

Таким образом, полная вещь

/*
    Note: this requires that the JQuery-DateFormat plugin be loaded first
    http://plugins.jquery.com/project/jquery-dateFormat
*/

(function ($) {
    $.fn.localTimeFromUTC = function (format) {

        return this.each(function () {

            // get time offset from browser
            var currentDate = new Date();
            var offset = -(currentDate.getTimezoneOffset() / 60);

            // get provided date
            var tagText = $(this).html();
            var givenDate = new Date(tagText);

            // apply offset
            var hours = givenDate.getUTCHours();
            hours += offset;
            givenDate.setHours(hours);

            // format the date
            var localDateString = $.format.date(givenDate, format);
            $(this).html(localDateString);
        });
    };
})(jQuery);

См. этот другой вопрос о том, как я использовал его в сочетании с плагином timeago.

0 голосов
/ 13 сентября 2011

CodeGrue большое спасибо за то, что поделились этим с сообществом.

Для тех, кто вынужден работать с часовыми поясами, отличными от UTC. Вы можете изменить функцию, добавив разницу во времени следующим образом:

Оригинальный фрагмент:

 var offset = -(currentDate.getTimezoneOffset() / 60);

Фрагмент, измененный для работы с часовым поясом CEST (смещение часового пояса: UTC + 2 часа):

 var offset = -(currentDate.getTimezoneOffset() / 60 + 2);

и т. Д.

...