1

我有这个功能:

function get_time_zone_offset() {   
    var current_date = new Date();   
    return -current_date.getTimezoneOffset() / 60; 
}

我想要一个 jQuery 代码来更改每个跨度,哪个类是 'timeago' 标题值到它的值加上上面函数返回的数字。例如:

前:

<span class="timeago" title="7/4/2012 9:28:30 AM">7/4/2012 9:28:30 AM</span>

后:

<span class="timeago" title="7/4/2012 12:28:30 PM">7/4/2012 12:28:30 PM</span>
4

3 回答 3

2

假设7/4/2012 9:28:30 AM代表 UTC,你可以让Date对象做所有的数学运算:

function formatDate(d) {
    var yy = d.getFullYear();
    var mm = d.getMonth() + 1;
    var dd = d.getDate();
    var hh = d.getHours();
    var ii = d.getMinutes();
    var ss = d.getSeconds();
    var ap;
    if (hh < 12) {
        if (hh === 0) {
            hh = 12;
        }
        ap = "AM";
    }
    else {
        if (hh > 12) {
            hh -= 12;
        }
        ap = "PM";
    }
    return mm + "/" + dd + "/" + yy + " " + hh + ":" + ii + ":" + ss + " " + ap;
}
$("span.timeago").each(function() {
    var dateInput = $(this).text();
    var dateInUTC = new Date(dateInput + " +0000"); // note: +0000 is the key
    var dateOutput = formatDate(dateInUTC);
    $(this).attr("title", dateOutput).text(dateOutput);
});

这假设日期是可解析的。这是一个演示

于 2012-07-04T10:14:51.300 回答
0

通过将函数传递给.attr [docs]非常简单:

var offset = get_time_zone_offset();
$('span.timeago').attr('title', function(i, val) {
    return +val + offset;
});

如果您必须先将值转换为正确的时间戳,请查看如何使用 javascript 从日期转换为 unix_timestamp

如果您使用的是Timeago插件,请注意以下备注:

您是否担心时区支持?不要这样。Timeago 也处理这个问题。只要您的时间戳采用ISO 8601格式并包含完整的时区指示符(±hhmm),那么无论您的访问者居住在哪个时区,一切都应该开箱即用。

因此,您甚至可能不必手动进行此转换。只需将正确的时区信息添加到值中即可。

于 2012-07-04T09:11:18.827 回答
0

看起来像这样的简单循环应该可以工作:

$('span.timeago').each(function(index, elm) {
    var newVal = $(elm).attr('title') * 1 + get_time_zone_offset(); // multiply by 1 to suppress string concatenation
    $(elm).attr('title', newVal);
});
于 2012-07-04T09:11:41.230 回答