PHP:从时间戳生成相对日期/时间
2022-08-30 14:06:17
我基本上试图将Unix时间戳(time()函数)转换为与过去和未来日期兼容的相对日期/时间。因此,输出可以是:
2 周 前
1小时和60分钟前
15 分 54 秒前
10 分 15 秒后
首先,我试图对此进行编码,但制作了一个巨大的不可维护的功能,然后我在互联网上搜索了几个小时,但我能找到的只是只产生一部分时间的脚本(例如:“1小时前”没有分钟)。
您是否有脚本已经可以执行此操作?
我基本上试图将Unix时间戳(time()函数)转换为与过去和未来日期兼容的相对日期/时间。因此,输出可以是:
2 周 前
1小时和60分钟前
15 分 54 秒前
10 分 15 秒后
首先,我试图对此进行编码,但制作了一个巨大的不可维护的功能,然后我在互联网上搜索了几个小时,但我能找到的只是只产生一部分时间的脚本(例如:“1小时前”没有分钟)。
您是否有脚本已经可以执行此操作?
此功能为您提供“1小时前”或“明天”,例如“现在”和“特定时间戳”之间的结果。
function time2str($ts)
{
if(!ctype_digit($ts))
$ts = strtotime($ts);
$diff = time() - $ts;
if($diff == 0)
return 'now';
elseif($diff > 0)
{
$day_diff = floor($diff / 86400);
if($day_diff == 0)
{
if($diff < 60) return 'just now';
if($diff < 120) return '1 minute ago';
if($diff < 3600) return floor($diff / 60) . ' minutes ago';
if($diff < 7200) return '1 hour ago';
if($diff < 86400) return floor($diff / 3600) . ' hours ago';
}
if($day_diff == 1) return 'Yesterday';
if($day_diff < 7) return $day_diff . ' days ago';
if($day_diff < 31) return ceil($day_diff / 7) . ' weeks ago';
if($day_diff < 60) return 'last month';
return date('F Y', $ts);
}
else
{
$diff = abs($diff);
$day_diff = floor($diff / 86400);
if($day_diff == 0)
{
if($diff < 120) return 'in a minute';
if($diff < 3600) return 'in ' . floor($diff / 60) . ' minutes';
if($diff < 7200) return 'in an hour';
if($diff < 86400) return 'in ' . floor($diff / 3600) . ' hours';
}
if($day_diff == 1) return 'Tomorrow';
if($day_diff < 4) return date('l', $ts);
if($day_diff < 7 + (7 - date('w'))) return 'next week';
if(ceil($day_diff / 7) < 4) return 'in ' . ceil($day_diff / 7) . ' weeks';
if(date('n', $ts) == date('n') + 1) return 'next month';
return date('F Y', $ts);
}
}
function relativeTime($time) {
$d[0] = array(1,"second");
$d[1] = array(60,"minute");
$d[2] = array(3600,"hour");
$d[3] = array(86400,"day");
$d[4] = array(604800,"week");
$d[5] = array(2592000,"month");
$d[6] = array(31104000,"year");
$w = array();
$return = "";
$now = time();
$diff = ($now-$time);
$secondsLeft = $diff;
for($i=6;$i>-1;$i--)
{
$w[$i] = intval($secondsLeft/$d[$i][0]);
$secondsLeft -= ($w[$i]*$d[$i][0]);
if($w[$i]!=0)
{
$return.= abs($w[$i]) . " " . $d[$i][1] . (($w[$i]>1)?'s':'') ." ";
}
}
$return .= ($diff>0)?"ago":"left";
return $return;
}
用法:
echo relativeTime((time()-256));
4 minutes 16 seconds ago