这可以用于评论和其他形式的通信,以告知时间前而不是精确时间,这对于不同时区的人来说可能不准确。
该函数仅使用类似于 time(); 结果的 Unix 时间戳。
方法 #1
<?php
function ago($time)
{
$periods = array("second", "minute", "hour", "day", "week", "month", "year", "decade");
$lengths = array("60","60","24","7","4.35","12","10");
$now = time();
$difference = $now - $time;
$tense = "ago";
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
$difference = round($difference);
if($difference != 1) {
$periods[$j].= "s";
}
return "$difference $periods[$j] 'ago' ";
}
?>
方法 #2
function _ago($tm,$rcs = 0) {
$cur_tm = time(); $dif = $cur_tm-$tm;
$pds = array('second','minute','hour','day','week','month','year','decade');
$lngh = array(1,60,3600,86400,604800,2630880,31570560,315705600);
for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh[$v])<=1); $v--); if($v < 0) $v = 0; $_tm = $cur_tm-($dif%$lngh[$v]);
$no = floor($no); if($no <> 1) $pds[$v] .='s'; $x=sprintf("%d %s ",$no,$pds[$v]);
if(($rcs == 1)&&($v >= 1)&&(($cur_tm-$_tm) > 0)) $x .= time_ago($_tm);
return $x;
}
需要一个 time() 值,它将告诉你多少秒/分钟/小时/天/年/十年前。
耶!我的时间前函数上线了!!
在第一种方法中,你不需要在 return 行中的 'ago' 周围使用单引号,除非你使用
return $difference . $periods[$j] . ' ago';
或类似的东西
确实,'ago' 不仅是多余的,而且在像这样内联使用时还会破坏流程
<?php
echo "It was done about " . ago($specialTime) . "). Byebye.";
?>
只需使用定义的 $tense 进行修复即可
return "$difference $periods[$j] $tense ";
第二个函数取自 php.net
https://php.ac.cn/manual/en/function.time.php#91864
并且应该从
function _ago($tm,$rcs = 0) {
更改为
function time_ago($tm,$rcs = 0) {
否则你会得到错误的结果。
非常有用,非常感谢!
如果你进行一些小的更改,你可以指定应将多少个较小的单位附加到字符串(使用第二个参数)。
只需将第 7 行替换为此行
if(($rcs > 0)&&($v >= 1)&&(($cur_tm-$_tm) > 0)) $x .= time_ago($_tm, --$rcs);
示例
time_ago(1291809455)
将返回“1 个月”time_ago(1291809455, 1)
将返回“1 个月 2 周”(这在不更改原始代码的情况下有效)time_ago(1291809455, 2)
将返回“1 个月 2 周 4 天”等等。
此函数引发错误
我将其发布在此处
http://www.phpfreaks.com/forums/index.php?topic=349575.0
大家好,
基于第二个函数,但用于输出西班牙语日期
已修改
输出
dia,dias,semana,semanas,mes,meses,año,años,decada,decadas
提示
$timeint = strtotime(‘2012-01-01 10:09:09’);
将其用于我的论坛最新帖子,非常感谢,完美运行!
感谢您提供此代码片段!它在我的一个正在开发的 Facebook 应用程序中发挥了很好的作用。我在源代码中给你们留了一条感谢评论。
不错 :( 但我的不起作用 :( 请帮帮我 :(( :DD 非常感谢 :DD :DD
演示?示例?
我们指的是像
自用户上次发布以来已过去“10 分钟 28 秒”
还是我们指的是
文章“7 分钟前更新”?
自己试试吧。:) 就像复制粘贴函数并像这样调用它一样简单
ago( time() – 777 );
如果你只输入 time(),它会显示“0 秒前” :P
感谢时间前脚本。我正在做一些研发来实现这个功能。
这是一个简短的版本
我认为这个更好
只想说感谢这个简单但代码优雅的脚本:) ..
很棒的小脚本,这为我节省了一些时间 :))
大家好,感谢你们辛勤工作!你们的网站对我们非洲人帮助很大
我创建了你的 PHP 函数的 Objective-C 版本。希望你不会介意
这是链接:http://yawn4life.blogspot.com/2012/08/n-days-ago-objective-c.html
函数第一次尝试就成功了,只需删除引号 'AGO'。太棒了!!
太棒了!该函数运行良好,并且比我编写的较长版本要好得多。谢谢!!
不过我添加了自己的小修改
return "$difference $periods[$j] $tense (".date( "D, F j, o", $time).")";
显示类似以下内容
1 周前(2012 年 9 月 30 日,星期日)
很棒的修改 :)
asaSAsaSAsASasa
Kezy,你使用 WordPress 吗?如果是,你介意帮我设置时间前函数吗?我尝试使用我之前评论中 Valtid 发布的说明,但结果显示我的帖子在一天前发布,而我是在查看帖子前一秒钟发布的 :(
这是一个很棒的脚本。非常感谢!
尽管我使用 jQuery timeago 插件,因为它会自动更新(无需刷新页面)并开箱即用地处理时区等,但我喜欢在标题和其他 timeago 不起作用的地方使用它。
例如,在一个我正在制作的网站上,当有人编辑评论时,我希望“(已编辑)” 的标题类似于“此评论已编辑 2 次(上次编辑 14 分钟前)”。
我不是 PHP 专家。所以我完全不知道如何使用这段代码..
我正在使用 WordPress,所以我是否将代码粘贴到我的 functions.php 文件中?
如果是,我该如何准确地将其调用到我的帖子中?
或者什么?我迷路了,请帮忙!
$unixtimestamp = strtotime(“now”);
$ago = ago($unixtimestamp);
echo $ago;
@keisa
转到你的模板,例如 page.php 或 single.php
并执行以下操作…
echo ago(strtotime(get_the_date()) );
所以你的意思是打印日期,但首先将字符串转换为时间(Unix 时间)
希望这在某种程度上有所帮助…
在 functions.php 中,你只是在定义函数,也就是创建它,然后你可以在任何你想使用的地方使用它。例如 single.php,这就是 php 函数的工作原理…‘ago’ 就是一个 php 函数,可以在以后重复使用。
有史以来最好的解决方案
日
月
年
选择一个
<?php
for($i=1;$i<32;$i++){
echo "$i”;
}
?>
选择一个
<?php
for($i=1;$i<13;$i++){
echo "$i”;
}
?>
选择一个
<?php
for($i=1901;$i<2002;$i++){
echo "$i”;
}
?>
<?php
if(isset($_POST['Submit']))
{
$c = array($_POST['day'], $_POST['month'], $_POST['year']);
$e = implode('-', $c);
}
echo "年龄计算器";
date_default_timezone_set('Asia/Calcutta');
$localtime = getdate();
$dob = "$e";
//$today = date("d-m-Y");
$today = $localtime['mday']."-".$localtime['mon']."-".$localtime['year'];
$dob_a = explode("-", $dob);
$today_a = explode("-", $today);
$dob_d = $dob_a[0];
$dob_m = $dob_a[1];
$dob_y = $dob_a[2];
$today_d = $today_a[0];
$today_m = $today_a[1];
$today_y = $today_a[2];
$years = $today_y – $dob_y;
$months = $today_m – $dob_m;
if ($today_m.$today_d < $dob_m.$dob_d) {
$years–;
$months = 12 + $today_m – $dob_m;
}
if ($today_d < $dob_d) {
$months–;
}
$firstMonths=array(1,3,5,7,8,10,12);
$secondMonths=array(4,6,9,11);
$thirdMonths=array(2);
if($today_m – $dob_m == 1) {
if(in_array($dob_m, $firstMonths)) {
array_push($firstMonths, 0);
}elseif(in_array($dob_m, $secondMonths)) {
array_push($secondMonths, 0);
}elseif(in_array($dob_m, $thirdMonths)) {
array_push($thirdMonths, 0);
}
}
echo " 年龄是 $years 年";
?>
<input name="" type="text" value="” disabled=”disabled”/>
喜欢这个,谢谢各位。我会在我的代码中添加你们的评论,因为我将把它用于我正在开发的一个创业项目。
我做了一个补充,在函数开始时对输入变量使用了一个 preg_match()
if (preg_match('/\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}/u', $time))
{
$time = strtotime($time);
}
这应该(即将测试)测试发送到函数的日期时间输入变量是否符合 2003-03-11 17:51:00 格式,并将其转换为 Unix 时间。我添加了这个,因为为了方便起见,我在数据库中以非 Unix 格式存储日期。
Matt
非常感谢!
旁注:如果你想要十年的输出,你需要将 for 行更改为
…&& $j < count($lengths)…
由于 for 循环已经是 0 索引的,因此使用 count($lengths)-1 会过早地将其截断。
Drupal 有一个很好的 API 函数可以实现这个功能
https://api.drupal.org/apis/format_interval
include<stdio.h>
哥们,你是救星 :)
我已经处理这个问题有一段时间了,但仍然无法使其对我有用。有什么提示吗?我总是得到“刚刚”
哇……真是太尴尬了。今天的日期是 2013-08-17T18:50:59……所以 2013-10-17T05:14:26 导致了错误……很棒的代码!
供参考……有一个 WordPress 函数 **human_time_diff()**
http://codex.wordpress.org/Function_Reference/human_time_diff
如果我们不使用 jQuery,这将非常有用。
感谢您的帖子
谢谢;今天用上了!
有没有人成功地将它与 gettext() 混合使用?
sprintf(_("%d %s "),$no,$pds[$v])
这对我不起作用
很棒的代码。
满足了我的目的。
感谢您提供的很棒的代码。它帮助了我们很多
非常感谢……技巧 2 对我来说非常有效……我在我的网站上使用了它:fjmdb.netne.net
@Julian wachholz – 谢谢。使用了您对第 7 行的建议..效果很好!
$str = ‘Fri, 15 Apr 2016 08:00:40 -0400’;
echo ago( $str ); // 46 年前
发生了什么事?????????
这里也有同样的问题,无法解决
感谢您的解决方案。运行良好!
很酷的东西!谢谢。很喜欢
谢谢,运行良好!!!
运行良好。但我做了一些修改以适应我的需求(我在函数中使用了 strtotime($time))。
我尝试了 @Gerard 为西班牙语版本提供的解决方案,但对我不起作用……所以我做了一些修改,现在它运行得非常完美。
这是代码。
function TimeAgoEs($tm,$rcs = 0) {
$cur_tm = time(); $dif = $cur_tm-$tm;
$pds = array('segundo','minuto','hora','día','semana','mes','año');
$lngh = array(1,60,3600,86400,604800,2630880,31570560);
for($v = sizeof($lngh)-1; ($v >= 0)&&(($no = $dif/$lngh[$v])<=1); $v--); if($v < 0) $v = 0; $_tm = $cur_tm-($dif%$lngh[$v]);
$no = floor($no);
if ($v >= 5 && $no <> 1) $pds[$v] .='es'; elseif($no <> 1) $pds[$v] .='s'; $x=sprintf("%d %s ",$no,$pds[$v]);
if(($rcs > 0)&&($v >= 1)&&(($cur_tm-$_tm) > 0)) $x .= TimeAgoEs($_tm, --$rcs);
return $x;
}
如何在数据库中使用该函数。因此,当用户发布评论时,发布日期进入数据库并返回“time_ago”,找不到正确的语法。如果有人可以帮忙,将不胜感激。