我想让每个帖子的时间在realTime中改变。
这只是时间的字体,因为这里要的是重要的。
<font class="timestamp" postdate="unixTimeStamp" postID="6">2 min ago</font>
<font class="timestamp" postdate="unixTimeStamp" postID="5">4 min ago</font>
<font class="timestamp" postdate="unixTimeStamp" postID="4">9 min ago</font>
这是javascript
setInterval(updateTimestamps,30000);
var realTime=<?php echo time();?>;
function updateTimestamps(){
$(".timestamp").each(function(i){
var timestamp=$(this).attr("postdate"),
postID=$(this).attr("postID"),
math=realTime-timestamp;
if(math<3600){var dataString='postID='+postID+'×tamp='+timestamp;
$.ajax({
type:"POST",
url:"http://site.com/ajax/humanTime.php",
data:dataString,
cache:false,
success:function(html){
$("[postID='"+postID+"']").html(html);
}
});
}
});
}
在humanTime.php中我计算时间:
$timestamp = $_POST['timestamp'];
$now=time(); $diff= $now - $timestamp; and so on..
但问题在于它对很多连接造成了影响,因为每个帖子都会调用脚本。并且认为也许我可以使1连接将数据排序为数组然后更改时间。但我从未与json合作,我确定我想要的是否真的可能
答案 0 :(得分:2)
为什么计算人类时间服务器端?您也可以完美地完成客户端的计算。
setInterval(updateTimestamps,30000);
var currentTime=<?php echo time();?>;
function updateTimestamps(){
$(".timestamp").each(function(i){
var timestamp=$(this).attr("postdate");
$(this).text(humanTime(currentTime, timestamp));
});
}
function humanTime(currentTime, timestamp)
{
var diff = currentTime - timestamp,
minute = 60,
hour = minute * 60,
day = hour * 24,
week = day * 7;
if (isNaN(diff) || diff < 0) {
return ""; // return blank string if unknown
}
if (diff < second * 2) {
// within 2 seconds
return 'right now';
}
if (diff < minute) {
return Math.floor(diff / second) + 'seconds ago';
}
if (diff < minute * 2) {
return 'about one minute';
}
if (diff < hour) {
return Math.floor(diff / minute) + 'minutes ago';
}
if (diff < hour * 2) {
return 'about an hour ago';
}
if (diff < day) {
return Math.floor(diff / hour) + 'hours ago';
}
if (diff > day && diff < day * 2) {
return 'yesterday';
}
if (diff < day * 365) {
return Math.floor(diff / day) + 'days ago';
}
else {
return 'more then a year ago';
}
}
此功能来自:http://www.queness.com/post/8567/create-a-dead-simple-twitter-feed-with-jquery
如上所述:使用<span>
代码或HTML5代码<time>
。
答案 1 :(得分:1)
我会做这样的事情:
setInterval(updateTimestamps,30000);
var ids = new Array();
function updateTimestamps(){
$(".timestamp").each(function(i){
var obj = new Object();
obj.id = $(this).attr("postID");
obj.timestamp = $(this).attr("postdate");
ids.push(obj);
}
$.post("http://site.com/ajax/humanTime.php", {"time": ids}, function(data) {
for (i = 0; i < data.length; i++) {
$("#" + data[i].id).html(data[i].content);
}
}, "json");
}
修改强> 在humanTime.php中:
<?php
$ids = json_decode($_POST['time']);
foreach($ids as $id) {
// Calculate human time ...
}
?>
然后返回这样的内容:
[{id:1, content:1 minute ago}, {id:3, content: 5 hours ago}]
PS:这个解决方案就是你所要求的,但我认为Bram aproach更好。
答案 2 :(得分:0)
<!-- if you like something simple :) -->
<span class="timestamp" data-unix="<?php echo time();?>">posted now</span>
<script type="text/javascript">
setInterval(function() {
$('span').each(function() {
var d = new Date();
// difference in minutes from now
var diff = Math.round(d.getTime()/60000 - $(this).attr('data-unix')/60);
$(this).html(diff + ' mins ago');
});
}, 60000);
</script>
答案 3 :(得分:0)
如何在您的间隔处理客户端:
示例标记可以是div,span等。
<div class="timestamp" postID="6"></div>
<div class="timestamp" postID="2"></div>
<div class="timestamp" postID="3"></div>
这支持现在和未来以及通用。
var time_formats = [
[60, 'just now', 1],
[120, '1 minute ago', '1 minute from now'],
[3600, 'minutes', 60],
[7200, '1 hour ago', '1 hour from now'],
[86400, 'hours', 3600],
[172800, 'yesterday', 'tomorrow'],
[604800, 'days', 86400],
[1209600, 'last week', 'next week'],
[2419200, 'weeks', 604800],
[4838400, 'last month', 'next month'],
[29030400, 'months', 2419200],
[58060800, 'last year', 'next year'],
[2903040000, 'years', 29030400],
[5806080000, 'last century', 'next century'],
[58060800000, 'centuries', 2903040000]
];
function prettydate(date_str) {
var time = ('' + date_str).replace(/-/g, "/").replace(/[TZ]/g, " ");
var seconds = (new Date() - new Date(time)) / 1000;
var token = 'ago';
var list_choice = 1;
if (seconds < 0) {
seconds = Math.abs(seconds);
token = 'from now';
list_choice = 2;
}
var i = 0,
format;
while (format = time_formats[i++]) if (seconds < format[0]) {
if (typeof format[2] == 'string') return format[list_choice];
else return Math.floor(seconds / format[2]) + ' ' + format[1] + ' ' + token;
}
return time;
}
// these would normally come from your ajax/creation of the element
$('.timestamp[postID=6]').data('postdate', '2012-03-20T09:24:17Z');
$('.timestamp[postID=2]').data('postdate', '2012-03-20T10:24:17Z');
$('.timestamp[postID=3]').data('postdate', '2012-03-20T08:24:17Z');
function formatTimes() {
$('.timestamp').each(function() {
$(this).text(prettydate($(this).data('postdate')));
});
}
setTimeout(formatTimes, 30000);