У меня есть эта функция для показа дружеских дат dateago с временной отметкой unix и форматом даты:
function friendlyDate($timestamp, $formats = null)
{
$_DATE_FORMAT = array(
'DAY' => 'DAY',
'DAY_HOUR' => 'DAY_HOUR',
'HOUR' => 'HOUR',
'HOUR_MINUTE' => 'HOUR_MINUTE',
'MINUTE' => 'MINUTE',
'MINUTE_SECOND' => 'MINUTE_SECOND',
'SECOND' => 'SECOND',
);
if ($formats == null) {
$formats = $_DATE_FORMAT;
}
$seconds = time() - $timestamp;
$minutes = floor($seconds / 60);
$hours = floor($minutes / 60);
$days = floor($hours / 24);
if ($days > 0 && $days<=3) {
$diffFormat = 'DAY';
} else if($days > 3){
return date('Y-m-d',$timestamp);
} else {
$diffFormat = ($hours > 0) ? 'HOUR' : 'MINUTE';
if ($diffFormat == 'HOUR') {
$diffFormat .= ($minutes > 0 && ($minutes - $hours * 60) > 0) ? '_MINUTE' : '';
} else {
$diffFormat = (($seconds - $minutes * 60) > 0 && $minutes > 0)
? $diffFormat.'_SECOND' : 'SECOND';
}
}
$dateDiff = null;
switch ($diffFormat) {
case 'DAY':
$dateDiff = sprintf($formats[$diffFormat], $days);
break;
case 'DAY_HOUR':
$dateDiff = sprintf($formats[$diffFormat], $days, $hours - $days * 60);
break;
case 'HOUR':
$dateDiff = sprintf($formats[$diffFormat], $hours);
break;
case 'HOUR_MINUTE':
$dateDiff = sprintf($formats[$diffFormat], $hours, $minutes - $hours * 60);
break;
case 'MINUTE':
$dateDiff = sprintf($formats[$diffFormat], $minutes);
break;
case 'MINUTE_SECOND':
$dateDiff = sprintf($formats[$diffFormat], $minutes, $seconds - $minutes * 60);
break;
case 'SECOND':
$dateDiff = sprintf($formats[$diffFormat], $seconds);
break;
}
return $dateDiff;
}
я echo
friendlyDate на моей странице:
echo friendlyDate(1436613754,'');
Но я вижу этот результат: SECOND
Что я могу сделать, чтобы исправить эту проблему, я бы хотел показать дату и время.
Основная проблема, которую я вижу, заключается в том, что у вас нет форматирующих директив в строках формата; т.е. значения в $_DATE_FORMAT
.
Когда функция sprintf()
выполняется до конца, строка формата содержит только слово "SECOND". Это означает, что значение переменной $seconds
игнорируется.
Попробуйте заменить свой формат массивом примерно так:
$_DATE_FORMAT = array(
'DAY' => '%d day(s)',
'DAY_HOUR' => '%d day(s), %d hour(s)',
'HOUR' => '%d hour(s)',
'HOUR_MINUTE' => '%d hour(s), %d minute(s)',
'MINUTE' => '%d minute(s)',
'MINUTE_SECOND' => '%d minute(s), %d second(s)',
'SECOND' => '%d second(s)'
);
Когда sprintf()
видит %d
в строке формата, он заменяет десятичное целочисленное значение из последующих аргументов. В этом случае переменные, такие как $seconds
и т.д. Этот пример не идеален, потому что он не дает форматированию шанс выбрать между сингулярным и множественным числом, но, надеюсь, это хороший старт.
(Это может быть не единственная проблема в функции, поскольку у меня не было возможности ее протестировать.)
Вот моя собственная timeAgo()
которую я использую,
function timeAgo($timestamp)
{
//calculate here
//@type cast
//@current time,
//@difference in timestamp
$timestamp = (int) $timestamp;
$current_time = $_SERVER['REQUEST_TIME'];
$diff = $current_time - $timestamp;
//Intervals in seconds
$intervals = array (
'year' => 31556926,
'month' => 2629744,
'week' => 604800,
'day' => 86400,
'hour' => 3600,
'minute' => 60
);
//Now we just find the difference
if($diff == 0)
{
return 'just now';
}
if($diff < 60)
{
return $diff == 1 ? $diff.' second ago' : $diff.' seconds ago';
}
if($diff >= 60 && $diff < $intervals['hour'])
{
$diff = floor($diff / $intervals['minute']);
return $diff == 1 ? $diff.' minute ago' : $diff.' minutes ago';
}
if($diff >= $intervals['hour'] && $diff < $intervals['day'])
{
$diff = floor($diff / $intervals['hour']);
return $diff == 1 ? $diff.' hour ago' : $diff.' hours ago';
}
if($diff >= $intervals['day'] && $diff < $intervals['week'])
{
$diff = floor($diff / $intervals['day']);
return $diff == 1 ? $diff.' day ago' : $diff.' days ago';
}
if($diff >= $intervals['week'] && $diff < $intervals['month'])
{
$diff = floor($diff / $intervals['week']);
return $diff == 1 ? $diff.' week ago' : $diff.' weeks ago';
}
if($diff >= $intervals['month'] && $diff < $intervals['year'])
{
$diff = floor($diff / $intervals['month']);
return $diff == 1 ? $diff.' month ago' : $diff.' months ago';
}
if($diff >= $intervals['year'])
{
$diff = floor($diff / $intervals['year']);
return $diff == 1 ? $diff.' year ago' : $diff.' years ago';
}
}
echo timeAgo(1436613754); //Outputs 8 months ago
SECOND
. мне нужно * секунд назад