Bir zaman damgası önce jQuery Zaman?

5 Cevap php

Aşağıda gerçekten güzel bir zaman önce onlar burada SO kullanmak ne çok benzer, jQuery için eklentisi edilir. Benim için sorun zaman dönüştürmek için bu kullanır.

<time class="timeago" datetime="2008-07-17T09:24:17Z">July 17, 2008</time>

Yani UTC damgası sitemde ben mağaza süre dışında harika olurdu ve biçimlendirilmiş bir zaman olarak, bu bir zaman damgası kullanmak gibi bir şey dönüştürmek için bir yolu var mı yok? PHP bu formata benim damgası dönüştürmek olabilir biliyorum ama PHP 1 sayfada kez bir LOT dönüştürme ile overkill gibi görünüyor. Ben yanlış olabilir, başkasının jquery ama gerçek timestamp bunu?

Ayrıca ben şu anda "4 dakika önce 2 saat" göstermek için bir sitede PHP bunu ancak wou7ld yerine PHP bunun için javascript kullanmak daha iyi olabilir mi?

/*
 * timeago: a jQuery plugin, version: 0.8.1 (2010-01-04)
 * @requires jQuery v1.2.3 or later
 *
 * Timeago is a jQuery plugin that makes it easy to support automatically
 * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
 *
 * For usage and examples, visit:
 * http://timeago.yarp.com/
 * Copyright (c) 2008-2010, Ryan McGeary (ryanonjavascript -[at]- mcgeary [*dot*] org)
 */
(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: null,
        prefixFromNow: null,
        suffixAgo: "ago",
        suffixFromNow: "from now",
        ago: null, // DEPRECATED, use suffixAgo
        fromNow: null, // DEPRECATED, use suffixFromNow
        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"
      }
    },
    inWords: function(distanceMillis) {
      var $l = this.settings.strings;
      var prefix = $l.prefixAgo;
      var suffix = $l.suffixAgo || $l.ago;
      if (this.settings.allowFuture) {
        if (distanceMillis < 0) {
          prefix = $l.prefixFromNow;
          suffix = $l.suffixFromNow || $l.fromNow;
        }
        distanceMillis = Math.abs(distanceMillis);
      }

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

      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(/-/,"/").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") === undefined) {
      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());
  }

  function substitute(stringOrFunction, value) {
    var string = $.isFunction(stringOrFunction) ? stringOrFunction(value) : stringOrFunction;
    return string.replace(/%d/i, value);
  }

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

5 Cevap

Burada Unix zaman damgasının ancak bir şey kullanarak JavaScript şeydir.

var d1;
var d2;
d1 = (new Date()).getTime(); setTimeout( function() { d2 = (new Date()).getTime(); }, 5000 );
var secondsElapsed = (d2 - d1) / 1000;
secondsElapsed; // 5 seconds

Şimdi, "timeago" işlev olarak aynı kapsamda bir JavaScript değişken bir zaman damgası saklayabilirsiniz ya, ya da bir HTML elemanı saklayabilirsiniz. Belirtildiği gibi, time elemanı, bir HTML 5 elementtir. Gibi bir şey yapabilirsiniz:


<p class="timestamp" style="display: none;">123456</p>

Sonra belki böyle bir açıklama öğesi var:


<div class="comment">
  <p>Lorem ipsum et dolor...</p>
  <p class="timestamp" style="display: none;">123456</p>
</div>

Daha sonra (bunu belirtilen beri jQuery varsayarak) tarafından bir açıklama için zaman damgası alabilir:


var tstamps = $('.comment .timestamp'); // array of comment timestamps
var timeago = ( (new Date()).getTime() - tstamps[0].html() ) / 1000;

Biraz hackish, ama (ben doğru yaptım eğer) o iş olur.

Tam olarak ne istediğinizi yapmak gibi görünüyor bu jquery eklenti bir göz atın.

http://timeago.yarp.com/

Ben aynı problem vardı. Ben PHP oluşturulur Unix zaman damgalarını kullanarak, o yüzden hızlı kesmek yapmak ve ayrıca damgaları işlemek için jQuery timeago ayrıştırma işlevini genişletmeye karar verdi. Bir cazibe gibi çalışır. Bunun etrafında hat 79 jquery.timeago.js dosyada en Ayrıştırma fonksiyonu için bakmak, ve aşağıdaki ile değiştirin:

  parse: function(iso8601) {
  if ((iso8601 - 0) == iso8601 && iso8601.length > 0) { // Checks if iso8601 is a unix timestamp
    var s = new Date(iso8601);
    if (isNaN(s.getTime())) { // Checks if iso8601 is formatted in milliseconds
      var s = new Date(iso8601 * 1000); //if not, add milliseconds 
    }
    return s;
  }

  var s = $.trim(iso8601);
  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);
},

I / saat javascript kütüphanesi bir tarihi olan DateJS.com kullanmak ister. Sen (2 saat önce ekran <span id='myfield'></span>) böyle güzel şeyler yapabilirsiniz:

$('#myfield').text( (2).hours().ago().toString("HH:mm") );

Bu ikisini de kullanarak daha iyi olurdu, ancak bu JS ile dinamik yapmak için gerekli değildir.

Aslında, sadece Facebook bu davranışı gördüm.

Ayrıca, <time> etiketi HTML5 olduğunu iyi biliyoruz? Birkaç uncompatibilities yaratabilir.