Как изменить часовой пояс / метку времени этого плагина jquery? - PullRequest
3 голосов
/ 28 мая 2011

Я использую этот плагин под названием timeago, который можно найти здесь: timeago.yarp.com

Он отлично работает, за исключением того, что он работает в другом часовом поясе.Я живу в восточной части США (часовой пояс Филадельфии), и когда я указываю точное время EST в плагине timeago (скажем, 2011-05-28, 13:47:18), он перепечатывается четырьмя часами позже на моей html-странице.Когда я пишу 2011-05-28, 17:47:18 (на четыре часа позже моего реального времени от того места, где я живу), ТОГДА он перепечатывается как «меньше минуты назад»

Вот код плагина jquery:

        (function($) {
      $.timeago = function(timestamp) {
    if (timestamp instanceof Date) {
      return inWords(timestamp);
    } else if (typeof timestamp === "string") {
      return inWords($.timeago.parse(timestamp));
    } else {
      return inWords($.timeago.datetime(timestamp));
    }
    };
    var $t = $.timeago;

    $.extend($.timeago, {
    settings: {
      refreshMillis: 60000,
      allowFuture: false,
      strings: {
        prefixAgo: "added",
        prefixFromNow: "added",
        suffixAgo: "ago",
        suffixFromNow: "from now",
        seconds: "less than a minute",
        minute: "about a minute",
        minutes: "%d minutes",
        hour: "about an hour",
        hours: "about %d hours",
        day: "a day",
        days: "%d days",
        month: "about a month",
        months: "%d months",
        year: "about a year",
        years: "%d years",
        numbers: []
      }
    },
    inWords: function(distanceMillis) {
      var $l = this.settings.strings;
      var prefix = $l.prefixAgo;
      var suffix = $l.suffixAgo;
      if (this.settings.allowFuture) {
        if (distanceMillis < 0) {
          prefix = $l.prefixFromNow;
          suffix = $l.suffixFromNow;
        }
        distanceMillis = Math.abs(distanceMillis);
      }

      var seconds = distanceMillis / 1000;
      var minutes = seconds / 60;
      var hours = minutes / 60;
      var days = hours / 24;
      var years = days / 365;

      function substitute(stringOrFunction, number) {
        var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
        var value = ($l.numbers && $l.numbers[number]) || number;
        return string.replace(/%d/i, value);
      }

      var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
        seconds < 90 && substitute($l.minute, 1) ||
        minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
        minutes < 90 && substitute($l.hour, 1) ||
        hours < 24 && substitute($l.hours, Math.round(hours)) ||
        hours < 48 && substitute($l.day, 1) ||
        days < 30 && substitute($l.days, Math.floor(days)) ||
        days < 60 && substitute($l.month, 1) ||
        days < 365 && substitute($l.months, Math.floor(days / 30)) ||
        years < 2 && substitute($l.year, 1) ||
        substitute($l.years, Math.floor(years));

      return $.trim([prefix, words, suffix].join(" "));
    },
    parse: function(iso8601) {
      var s = $.trim(iso8601);
      s = s.replace(/\.\d\d\d+/,""); // remove milliseconds
      s = s.replace(/-/,"/").replace(/-/,"/");
      s = s.replace(/T/," ").replace(/Z/," UTC");
      s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
      return new Date(s);
    },
    datetime: function(elem) {
      // jQuery's `is()` doesn't play well with HTML5 in IE
      var isTime = $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
      var iso8601 = isTime ? $(elem).attr("datetime") : $(elem).attr("title");
      return $t.parse(iso8601);
    }
    });
  $.fn.timeago = function() {
    var self = this;
    self.each(refresh);

    var $s = $t.settings;
    if ($s.refreshMillis > 0) {
      setInterval(function() { self.each(refresh); }, $s.refreshMillis);
    }
    return self;
   };

  function refresh() {
    var data = prepareData(this);
    if (!isNaN(data.datetime)) {
      $(this).text(inWords(data.datetime));
    }
    return this;
  }

  function prepareData(element) {
    element = $(element);
    if (!element.data("timeago")) {
      element.data("timeago", { datetime: $t.datetime(element) });
      var text = $.trim(element.text());
      if (text.length > 0) {
        element.attr("title", text);
      }
    }
     return element.data("timeago");
   }

    function inWords(date) {
    return $t.inWords(distance(date));
    }

    function distance(date) {
      return (new Date().getTime() - date.getTime());
    }

    // fix for IE6 suckage
    document.createElement("abbr");
    document.createElement("time");
    }(jQuery));

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

Спасибо!

Ответы [ 3 ]

10 голосов
/ 28 мая 2011

Обновлено

Я собираюсь дать этому шанс, но я должен добавить заявление об отказе от ответственности, что я сам немного неясен с этим, так что я могу быть совершенно неправ!

Плагин ожидает время в формате ISO 8601 , которое также может включать информацию о смещении . Я сейчас попробовал использовать плагин, и вот что я вижу (на 14:42 EDT, примерно в 3 минутах от строки времени теста):

  • Когда используется конечный Z, указывающий Zulu time или смещение 0 от UTC, плагин интерпретирует его как UTC (очевидно) и при печати строки относительного времени, он принимает во внимание ваш фактический часовой пояс. Это приводит к добавлению дополнительных 4 часов ( EST - это UTC-5 (UTC-4, когда следует DST, как сейчас) ).

    2011-05-28T14:39:33Z печатается как about 4 hours ago

  • Когда трейлинг Z используется , а не , плагин интерпретирует время, указанное в соответствии с вашим часовым поясом, и, кажется, работает нормально (, пока часовой пояс для отметка времени и часовой пояс, в котором вы просматриваете эту отметку времени, совпадают ). Это соответствует тому, что в статье Википедии говорится:

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

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

    2011-05-28T14:39:33 печатается как 3 minutes ago

  • Когда указывается завершающий Z вместе со смещением часового пояса (в формате hh:mm только hh, кажется, игнорируется), он все равно, кажется, работает очень хорошо.

    2011-05-28T14:39:33Z-04:00 печатается как 3 minutes ago

Рабочий пример можно посмотреть здесь: http://jsfiddle.net/nogoodatcoding/SVgck/


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

  • Одним из исправлений является также указание смещения часового пояса в строках даты-времени: 2011-05-28, 13:47:18Z-04:00 - в некотором смысле, более полное описание времени, поскольку оно также включает информацию о смещении UTC.
  • В зависимости от того, как вы генерируете эту страницу (если это не просто статический HTML), другой вариант - исправить код на стороне сервера так, чтобы выводимая строка даты и времени была в формате UTC - если не построена в, вы должны быть в состоянии найти библиотеку, которая выполняет преобразование из временной метки в вашем местном часовом поясе в UTC Это то, как сайты, которые я видел, делают это - например, метки времени здесь в StackOverflow (или в Twitter и Facebook) имеют время UTC - тогда они форматируются по-разному в зависимости от часового пояса пользователя.
1 голос
/ 28 мая 2011

Эй, я использую этот плагин.Это не JavaScript, который вы должны редактировать.Найдите файл php, в WordPress он называется «wpTimeAgo.php», он должен быть похож на этот.

В этом файле найдите:

var $_gmtOffset = '';

Добавьте туда число, я считаю, что должно сработать.

0 голосов
/ 08 января 2013

Если вы используете timeago в мире .NET, вы обнаружите, что очень суетливо относитесь к полученному смещению.z и zz не будут работать, они должны быть zzz и должны включать большие разделители "Z" и "T".

Например:

string.Format("{0}Z{1:%zzz}", DateTime.Now.ToString("s"), DateTime.Now);

Отображается как:

2013-01-06T12: 46: 28Z-08: 00

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