jQuery Zeit aus einem timestamp?
Unten ist eine wirklich schöne Zeit-plugin für jQuery, sehr ähnlich zu dem, was Sie hier verwenden, auf SO. Das problem für mich ist, dass es verwendet diese zu konvertieren Zeit.
<time class="timeago" datetime="2008-07-17T09:24:17Z">July 17, 2008</time>
Das wäre toll, außer dass ich den Speicher mal auf meiner Seite in UTC-timestamp und nicht als Zeit formatiert, gibt es eine Möglichkeit, zu konvertieren, so etwas wie dieses zu verwenden, einen Zeitstempel? Ich weiß, in PHP könnte ich meine konvertieren Zeitstempel in diesem format, aber es scheint wie overkill mit der Konvertierung eine MENGE von Zeiten auf die 1 Seite in PHP. Ich könnte falsch sein, jemand anderes dies in jquery, aber von echten timestamp?
Außerdem momentan mache ich das in PHP auf einer Website zu zeigen, "2 Stunden 4 Minuten" aber wou7ld es besser sein, javascript zu verwenden, für diese statt PHP?
/*
* 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);
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem. Ich bin mit Unix-timestamps, die generiert werden, von PHP, also habe ich beschlossen, einen quick-hack und verlängern die parsing-Funktion von jQuery timeago zu handhaben Zeitstempel zusätzlich. Funktioniert wie ein Charme. Schauen Sie sich einfach für die Parse-Funktion an um die Zeile 79 in der jquery.timeago.js Datei, und ersetzen durch die folgenden:
Hier ist etwas in JavaScript mit nichts als Unix-Zeitstempel.
Nun, können Sie entweder speichern Sie einen Zeitstempel in eine JavaScript-variable in dem gleichen Umfang wie Ihre "timeago" Funktion, oder Sie können speichern Sie es in ein HTML-element. Wie bereits erwähnt, die
time
element ist ein HTML 5 element. Sie könnten etwas tun wie:Dann haben Sie vielleicht einen Kommentar posten wie:
Könnte man dann die timestamp /Zeitstempel für ein Kommentar durch (vorausgesetzt, jQuery, da Sie es erwähnt):
Es ist ein bisschen hackish, aber es würde funktionieren (wenn ich es Recht).
Möchte ich DateJS.com, die ein Datum /Zeit-javascript-Bibliothek. Sie tun kann Coole Sachen wie diese (display 2 Stunden in einem
<span id='myfield'></span>
):Es wäre besser mit beiden, aber es ist nicht notwendig, um es dynamisch mit JS.
In der Tat, ich habe nur gesehen, dass dieses Verhalten in Facebook.
Zudem, sind Sie sich bewusst, dass die
<time>
tag ist HTML5? Es können ein paar uncompatibilities.