是否有一个JQuery插件将UTC日期时间转换为本地用户时区?

Is there a JQuery plugin to convert UTC datetimes to local user timezone?

如果我有一个标签:

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

我想要一个jquery脚本或插件将每个utctime类转换为当前用户的浏览器本地时间。 在写一篇文章之前我更愿意找到它。


好的,所以我创建了一个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
    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);

用法:

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

    $('.utcdate').localTimeFromUTC('MM/dd/yyyy hh:mm a');


使用输入日期查找时区偏移量。对于DST更改很重要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
(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);

像......一样使用它

1
2
3
4
5
6
7
8
function ConvertDatesToLocalTime() {
        $('.ConvertUtcToLocal').localTimeFromUTC('MM/dd/yyyy hh:mm:ss a');
    }

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

    });

将"ConvertUtcToLocal"类分配给需要转换的所有元素。


1
2
3
4
5
6
7
8
9
$(".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库一起使用,以在用户时区中显示时间


当我使用它时,我不得不改变这条线

1
var hours = givenDate.getHours();

1
var hours = givenDate.getUTCHours();

通过这个调试时,行var givenDate = new Date(tagText)最终创建一个UTC格式的Date对象(如果你给它一个RFC1123格式的日期,例如ddd, dd MMM yyyy HH:mm:ss GMT),但当你打电话给getHours时,你会得到当地时区。因此,除非你调用getUTCHours,否则它不起作用。

所以完整的事情是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
    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插件结合使用。


CodeGrue非常感谢与社区分享这一点。

对于那些被迫使用其他时区而不是UTC的人来说,你可以通过添加这样的时差来改变这个功能:

原始片段:

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

片段已更改为与CEST时区一起使用(时区偏移:UTC + 2小时):

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

等等。