如何显示相对于绝对日期的跨浏览器?

时间:2010-06-25 16:54:19

标签: javascript jquery django cross-browser

我如何操纵日期以便它们显示为“刚刚”...“5分钟前”...“3小时前”...“2010年6月22日下午1:45”以类似的方式SO如何显示每个问题的答案/评论旁边的日期?

更复杂的是,我的数据库中存储的日期是GMT时间(很好),但我希望它们出现在每个用户浏览器的时区中。

我已经尝试了John Resig的漂亮日期插件:http://bassistance.de/jquery-plugins/jquery-plugin-prettydate/,我编辑了它,以便从数据库中的GMT时间中减去时区偏移量。但是,此解决方案仅适用于FireFox。

在我添加时区偏移后,这是'prettydate'功能:

format : function(time) {
var date = new Date(time);
var currentDate = new Date();
var timezoneOffsetInMilliseconds = currentDate.getTimezoneOffset() * 60000;
var currentTimeInMillisecondsUtc = currentDate.getTime();
var givenTimeInMillisecondsUtc = date.getTime()- timezoneOffsetInMilliseconds;
var diffInSeconds = ((currentTimeInMillisecondsUtc - givenTimeInMillisecondsUtc) / 1000);
var day_diff = Math.floor(diffInSeconds / 86400);

if (isNaN(day_diff) || day_diff < 0)
    return;

        // If longer than a month, calculate the date w/ timezone offset
        if (day_diff >= 31)
            return new Date(givenTimeInMillisecondsUtc).toLocaleString();

        var messages = $.prettyDate.messages;
        return day_diff == 0 && (diffInSeconds < 60 && messages.now 
            || diffInSeconds < 120 && messages.minute
             || diffInSeconds < 3600
             && messages.minutes(Math.floor(diffInSeconds / 60))
            || diffInSeconds < 7200 && messages.hour || diffInSeconds < 86400
            && messages.hours(Math.floor(diffInSeconds / 3600)))
            || day_diff == 1 && messages.yesterday || day_diff < 7
            && messages.days(day_diff) || day_diff < 31
            && messages.weeks(Math.ceil(day_diff / 7));
    }

编辑:  我正在使用带有Django模板的Python(通过Google Webapp),以及我以iso格式传递'db.DateTimeProperty()'的'time'对象,如下所示:

<span class="prettyDate" title='{{ q.date.isoformat }}'>{{q.date.isoformat}}</span>

1 个答案:

答案 0 :(得分:2)

为什么不在服务器端使用内置模板标记timesince或自定义模板标记?

在相对时间内,对于时区没有意义,只要你正在进行的2次传播是在同一个区域。对于过去距离较远的结果,并且您希望以绝对时间呈现,您将不得不自己做时间转移。为此,您必须ask the user for her timezone (or use some JS on a previous page to send it to you)并将其存储在用户个人资料中。

还讨论了in the mailing list