Как отобразить относительную к абсолютной дате кросс-браузер? - PullRequest
6 голосов
/ 25 июня 2010

Как я могу манипулировать датами, чтобы они отображались как "только сейчас" ... "5 минут назад" ... "3 часа назад" ... "22 июня 2010 года в 13:45" таким же образом как ТАК отображать даты рядом с ответами / комментариями на каждый вопрос?

Чтобы еще больше усложнить ситуацию, даты, хранящиеся в моей базе данных, соответствуют времени по Гринвичу (что хорошо), но я хочу, чтобы они отображались в часовом поясе браузера каждого пользователя.

Я уже пробовал красивый плагин даты от Джона Ресига: 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));
    }

Edit: Я использую Python с шаблонами Django (через Google Webapp), и объект 'time', который я передаю в 'db.DateTimeProperty ()' в формате iso, выглядит так:

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

1 Ответ

2 голосов
/ 25 июня 2010

Почему бы не сделать это на стороне сервера с помощью встроенного тега шаблона timesince или пользовательского тега шаблона?

В относительном времени для часовых поясов значение не имеетдолго 2 раза вы находитесь в одной зоне.Для результатов, которые находятся в далеком прошлом, и которые вы хотите представить как абсолютные времена, вам придется самостоятельно сдвигать время.для этого вам нужно запросить у пользователя его часовой пояс (или использовать JS на предыдущей странице, чтобы отправить его вам) и сохранить его в профиле пользователя.

thisтакже обсуждается в списке рассылки .

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