Как конвертировать миллисекунды к датам раз без Datetime - PHP [duplicate]

Мой вопрос + ответ связан, и я делаю выражение и мета-выражение, которое может соответствовать произвольным (конечным) уровням вложенности. Это довольно изящно, но что еще вы можете ожидать? Используйте обратные ссылки в матче, если ваш движок поддерживает его.

194
задан lorem monkey 27 September 2012 в 10:37
поделиться

30 ответов

Пример использования:

echo time_elapsed_string('2013-05-01 00:22:35');
echo time_elapsed_string('@1367367755'); # timestamp input
echo time_elapsed_string('2013-05-01 00:22:35', true);

Вход может быть любым поддерживаемым форматом даты и времени .

Выход:

4 months ago
4 months, 2 weeks, 3 days, 1 hour, 49 minutes, 15 seconds ago

Функция:

function time_elapsed_string($datetime, $full = false) {
    $now = new DateTime;
    $ago = new DateTime($datetime);
    $diff = $now->diff($ago);

    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;

    $string = array(
        'y' => 'year',
        'm' => 'month',
        'w' => 'week',
        'd' => 'day',
        'h' => 'hour',
        'i' => 'minute',
        's' => 'second',
    );
    foreach ($string as $k => &$v) {
        if ($diff->$k) {
            $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
        } else {
            unset($string[$k]);
        }
    }

    if (!$full) $string = array_slice($string, 0, 1);
    return $string ? implode(', ', $string) . ' ago' : 'just now';
}
341
ответ дан Glavić 21 August 2018 в 04:14
поделиться
  • 1
    Часть недели хороша, но в целом функция должна быть более гибкой ($full должен быть строковым вводом для фильтрации вывода по мере необходимости). например time_elapsed_string($datetime, $format = "ymw"). Постскриптум Плоская версия: stackoverflow.com/a/5010169/318765 – mgutt 28 January 2014 в 14:19
  • 2
    Что касается моего последнего комментария: смените $full = false на $level = 7 и if (!$full) $string = array_slice($string, 0, 1); на $string = array_slice($string, 0, $level); и вызовите time_elapsed_string($datetime, 2), чтобы получить только две строки с наивысшей датой. Я думаю, что это соответствует всем потребностям. – mgutt 28 January 2014 в 14:39
  • 3
    @mgutt: fromc эта функция не будет работать для сценария any-case-user-хочет; но это хорошая отправная точка, где вы можете с минимальными исправлениями получить то, что вам нужно, например, вы уже продемонстрировали ... – Glavić 28 January 2014 в 15:12
  • 4
    Я получаю Unknown property (w) на этой строке $diff->w = floor($diff->d / 7); – vonUbisch 30 June 2015 в 11:14
  • 5
    Чтобы исправить эту проблему Unknown property (w) в PHP5.3 и ниже, преобразуйте $ diff из объекта в массив и соответствующим образом отредактируйте остальную часть кода. У меня есть исправление, размещенное здесь: stackoverflow.com/a/32723846/235633 – bafromca 22 September 2015 в 23:54

это поможет вам проверить его

   function calculate_time_span($seconds)
{  
 $year = floor($seconds /31556926);
$months = floor($seconds /2629743);
$week=floor($seconds /604800);
$day = floor($seconds /86400); 
$hours = floor($seconds / 3600);
 $mins = floor(($seconds - ($hours*3600)) / 60); 
$secs = floor($seconds % 60);
 if($seconds < 60) $time = $secs." seconds ago";
 else if($seconds < 3600 ) $time =($mins==1)?$mins."now":$mins." mins ago";
 else if($seconds < 86400) $time = ($hours==1)?$hours." hour ago":$hours." hours ago";
 else if($seconds < 604800) $time = ($day==1)?$day." day ago":$day." days ago";
 else if($seconds < 2629743) $time = ($week==1)?$week." week ago":$week." weeks ago";
 else if($seconds < 31556926) $time =($months==1)? $months." month ago":$months." months ago";
 else $time = ($year==1)? $year." year ago":$year." years ago";
return $time; 
}  
  $seconds = time() - strtotime($post->post_date); 
echo calculate_time_span($seconds); 
2
ответ дан Abbbas khan 21 August 2018 в 04:14
поделиться

Я сделал это, и он работает отлично, он работает как для временной отметки unix как 1470919932, так и для форматированного времени, например 16-08-11 14:53:30

function timeAgo($time_ago) {
    $time_ago =  strtotime($time_ago) ? strtotime($time_ago) : $time_ago;
    $time  = time() - $time_ago;

switch($time):
// seconds
case $time <= 60;
return 'lessthan a minute ago';
// minutes
case $time >= 60 && $time < 3600;
return (round($time/60) == 1) ? 'a minute' : round($time/60).' minutes ago';
// hours
case $time >= 3600 && $time < 86400;
return (round($time/3600) == 1) ? 'a hour ago' : round($time/3600).' hours ago';
// days
case $time >= 86400 && $time < 604800;
return (round($time/86400) == 1) ? 'a day ago' : round($time/86400).' days ago';
// weeks
case $time >= 604800 && $time < 2600640;
return (round($time/604800) == 1) ? 'a week ago' : round($time/604800).' weeks ago';
// months
case $time >= 2600640 && $time < 31207680;
return (round($time/2600640) == 1) ? 'a month ago' : round($time/2600640).' months ago';
// years
case $time >= 31207680;
return (round($time/31207680) == 1) ? 'a year ago' : round($time/31207680).' years ago' ;

endswitch;
}

?>
4
ответ дан Ahmad ghoneim 21 August 2018 в 04:14
поделиться
  • 1
    Разве это не должно быть switch (true), хотя $time будет оцениваться до true? – Mavelo 21 July 2018 в 13:23

При использовании MySQL используйте функцию UNIX_TIMESTAMP() .

0
ответ дан Amal Murali 21 August 2018 в 04:14
поделиться

Я использую следующую функцию в течение нескольких лет. И он работает нормально:

function timeDifference($timestamp)
{
    $otherDate=$timestamp;
    $now=@date("Y-m-d H:i:s");

    $secondDifference=@strtotime($now)-@strtotime($otherDate);
    $extra="";
    if ($secondDifference == 2592000) { 
    // months 
    $difference = $secondDifference/2592000; 
    $difference = round($difference,0); 
    if ($difference>1) { $extra="s"; } 
    $difference = $difference." month".$extra." ago"; 
}else if($secondDifference > 2592000)
    {$difference=timestamp($timestamp);} 
elseif ($secondDifference >= 604800) { 
    // weeks 
    $difference = $secondDifference/604800; 
    $difference = round($difference,0); 
    if ($difference>1) { $extra="s"; } 
    $difference = $difference." week".$extra." ago"; 
} 
elseif ($secondDifference >= 86400) { 
    // days 
    $difference = $secondDifference/86400; 
    $difference = round($difference,0); 
    if ($difference>1) { $extra="s"; } 
    $difference = $difference." day".$extra." ago"; 
} 
elseif ($secondDifference >= 3600) { 
    // hours 

    $difference = $secondDifference/3600; 
    $difference = round($difference,0); 
    if ($difference>1) { $extra="s"; } 
    $difference = $difference." hour".$extra." ago"; 
} 
elseif ($secondDifference < 3600) { 
    // hours 
    // for seconds (less than minute)
    if($secondDifference<=60)
    {       
        if($secondDifference==0)
        {
            $secondDifference=1;
        }
        if ($secondDifference>1) { $extra="s"; }
        $difference = $secondDifference." second".$extra." ago"; 

    }
    else
    {

$difference = $secondDifference/60; 
        if ($difference>1) { $extra="s"; }else{$extra="";}
        $difference = round($difference,0); 
        $difference = $difference." minute".$extra." ago"; 
    }
} 

$FinalDifference = $difference; 
return $FinalDifference;
}
-3
ответ дан Ayyaz Zafar 21 August 2018 в 04:14
поделиться

Я изменил исходную функцию немного, чтобы быть (на мой взгляд, более полезным или логичным).

// display "X time" ago, $rcs is precision depth
function time_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 = count($lngh) - 1; ($v >= 0) && (($no = $dif / $lngh[$v]) <= 1); $v--);
    if ($v < 0)
      $v = 0;
  $_tm = $cur_tm - ($dif % $lngh[$v]);

  $no = ($rcs ? floor($no) : round($no)); // if last denomination, round

  if ($no != 1)
    $pds[$v] .= 's';
  $x = $no . ' ' . $pds[$v];

  if (($rcs > 0) && ($v >= 1))
    $x .= ' ' . $this->time_ago($_tm, $rcs - 1);

  return $x;
}
5
ответ дан Bobb Fwed 21 August 2018 в 04:14
поделиться
  • 1
    Любая функция, использующая математику на основе фиксированного календаря, в корне неверна. Используйте объект Date, не выполняйте математику со временем. – Chris Baker 13 September 2014 в 01:42
  • 2
    @ chris-baker Когда большинство людей используют эти типы функций, точность во втором не нужна. Функция точна в течение коротких периодов времени, и в течение длительных периодов времени близость более чем достаточно. – Bobb Fwed 28 July 2016 в 17:46
function humanTiming ($time)
        {

            $time = time() - $time; // to get the time since that moment
            $time = ($time<1)? 1 : $time;
            $tokens = array (
                31536000 => 'year',
                2592000 => 'month',
                604800 => 'week',
                86400 => 'day',
                3600 => 'hour',
                60 => 'minute',
                1 => 'second'
            );

            foreach ($tokens as $unit => $text) {
                if ($time < $unit) continue;
                $numberOfUnits = floor($time / $unit);
                return $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'');
            }

        }

echo humanTiming( strtotime($mytimestring) );
7
ответ дан brycejl 21 August 2018 в 04:14
поделиться
  • 1
    Это действительно здорово. Спасибо, что поделились. Но бывают случаи, когда функция возвращает $ numberOfUnits empty, и она просто выводит «назад». Похоже, потому что значение меньше 1 секунды. В этом случае, если вы можете сделать его по умолчанию чем-то вроде «сейчас» & quot; это было бы прекрасно. – Hezerac 27 September 2016 в 21:31

Вот мое решение для модуля уведомлений, который я построил некоторое время назад. Он возвращает результат, похожий на раскрывающийся список уведомлений Facebook (например, 1 день назад, только сейчас и т. Д.).

public function getTimeDifference($time) {
    //Let's set the current time
    $currentTime = date('Y-m-d H:i:s');
    $toTime = strtotime($currentTime);

    //And the time the notification was set
    $fromTime = strtotime($time);

    //Now calc the difference between the two
    $timeDiff = floor(abs($toTime - $fromTime) / 60);

    //Now we need find out whether or not the time difference needs to be in
    //minutes, hours, or days
    if ($timeDiff < 2) {
        $timeDiff = "Just now";
    } elseif ($timeDiff > 2 && $timeDiff < 60) {
        $timeDiff = floor(abs($timeDiff)) . " minutes ago";
    } elseif ($timeDiff > 60 && $timeDiff < 120) {
        $timeDiff = floor(abs($timeDiff / 60)) . " hour ago";
    } elseif ($timeDiff < 1440) {
        $timeDiff = floor(abs($timeDiff / 60)) . " hours ago";
    } elseif ($timeDiff > 1440 && $timeDiff < 2880) {
        $timeDiff = floor(abs($timeDiff / 1440)) . " day ago";
    } elseif ($timeDiff > 2880) {
        $timeDiff = floor(abs($timeDiff / 1440)) . " days ago";
    }

    return $timeDiff;
}
-2
ответ дан Ciaran 21 August 2018 в 04:14
поделиться

Просто чтобы добавить другой вариант ...

Хотя я предпочитаю публикацию метода DateTime здесь , мне не понравилось, что он отображал 0 лет и т. д.

/* 
 * Returns a string stating how long ago this happened
 */

private function timeElapsedString($ptime){
    $diff = time() - $ptime;
    $calc_times = array();
    $timeleft   = array();

    // Prepare array, depending on the output we want to get.
    $calc_times[] = array('Year',   'Years',   31557600);
    $calc_times[] = array('Month',  'Months',  2592000);
    $calc_times[] = array('Day',    'Days',    86400);
    $calc_times[] = array('Hour',   'Hours',   3600);
    $calc_times[] = array('Minute', 'Minutes', 60);
    $calc_times[] = array('Second', 'Seconds', 1);

    foreach ($calc_times AS $timedata){
        list($time_sing, $time_plur, $offset) = $timedata;

        if ($diff >= $offset){
            $left = floor($diff / $offset);
            $diff -= ($left * $offset);
            $timeleft[] = "{$left} " . ($left == 1 ? $time_sing : $time_plur);
        }
    }

    return $timeleft ? (time() > $ptime ? null : '-') . implode(' ', $timeleft) : 0;
}
4
ответ дан Community 21 August 2018 в 04:14
поделиться
  • 1
    1 год = 360 дней? $calc_times[] = array('Year', 'Years', 31557600 ); shurely? – richplane 11 March 2015 в 13:59
  • 2
    Хорошее место, я сейчас обновлю его. И не называй меня Ширли! :п – TMH 27 April 2015 в 13:34
  • 3
    Я думаю, что это действительно лучшее и более чистое решение здесь. – user2513846 3 May 2016 в 03:12

Ниже приведено очень простое и чрезвычайно эффективное решение.

function timeElapsed($originalTime){

        $timeElapsed=time()-$originalTime;

        /*
          You can change the values of the following 2 variables 
          based on your opinion. For 100% accuracy, you can call
          php's cal_days_in_month() and do some additional coding
          using the values you get for each month. After all the
          coding, your final answer will be approximately equal to
          mine. That is why it is okay to simply use the average
          values below.
        */
        $averageNumbDaysPerMonth=(365.242/12);
        $averageNumbWeeksPerMonth=($averageNumbDaysPerMonth/7);

        $time1=(((($timeElapsed/60)/60)/24)/365.242);
        $time2=floor($time1);//Years
        $time3=($time1-$time2)*(365.242);
        $time4=($time3/$averageNumbDaysPerMonth);
        $time5=floor($time4);//Months
        $time6=($time4-$time5)*$averageNumbWeeksPerMonth;
        $time7=floor($time6);//Weeks
        $time8=($time6-$time7)*7;
        $time9=floor($time8);//Days
        $time10=($time8-$time9)*24;
        $time11=floor($time10);//Hours
        $time12=($time10-$time11)*60;
        $time13=floor($time12);//Minutes
        $time14=($time12-$time13)*60;
        $time15=round($time14);//Seconds

        $timeElapsed=$time2 . 'yrs ' . $time5 . 'months ' . $time7 . 
                     'weeks ' . $time9 .  'days ' . $time11 . 'hrs '
                     . $time13 . 'mins and ' . $time15 . 'secs.';

        return $timeElapsed;

}

echo timeElapsed (1201570814);

Выход образца:

6yrs 4months 3weeks 4 дня 12 часов 40 минут и 36 секунд.

-2
ответ дан demongolem 21 August 2018 в 04:14
поделиться

Вот мое решение, пожалуйста, проверьте и измените в соответствии с вашими требованиями

function getHowLongAgo($date, $display = array('Year', 'Month', 'Day', 'Hour', 'Minute', 'Second'), $ago = '') {
        date_default_timezone_set('Australia/Sydney');
        $timestamp = strtotime($date);
        $timestamp = (int) $timestamp;
        $current_time = 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 ';
        }
    }

Спасибо

-1
ответ дан Dineshaws 21 August 2018 в 04:14
поделиться

Это то, с чем я пошел. Его модифицированная версия сообщения Abbbas khan:

<?php

  function calculate_time_span($post_time)
  {  
  $seconds = time() - strtotime($post);
  $year = floor($seconds /31556926);
  $months = floor($seconds /2629743);
  $week=floor($seconds /604800);
  $day = floor($seconds /86400); 
  $hours = floor($seconds / 3600);
  $mins = floor(($seconds - ($hours*3600)) / 60); 
  $secs = floor($seconds % 60);
  if($seconds < 60) $time = $secs." seconds ago";
  else if($seconds < 3600 ) $time =($mins==1)?$mins."now":$mins." mins ago";
  else if($seconds < 86400) $time = ($hours==1)?$hours." hour ago":$hours." hours ago";
  else if($seconds < 604800) $time = ($day==1)?$day." day ago":$day." days ago";
  else if($seconds < 2629743) $time = ($week==1)?$week." week ago":$week." weeks ago";
  else if($seconds < 31556926) $time =($months==1)? $months." month ago":$months." months ago";
  else $time = ($year==1)? $year." year ago":$year." years ago";
  return $time; 
  }  



 // uses
 // $post_time="2017-12-05 02:05:12";
 // echo calculate_time_span($post_time); 
0
ответ дан drtechno 21 August 2018 в 04:14
поделиться

Многие решения здесь не учитывали округление. Например:

Событие произошло в 3 часа дня два дня назад. Если вы проверяете в 2 часа дня, он будет показан один день назад. Если вы проверяете в 4 часа дня, он будет показан два дня назад.

Если вы работаете с временем unix, это помогает:

// how long since event has passed in seconds
$secs = time() - $time_ago;

// how many seconds in a day
$sec_per_day = 60*60*24;

// days elapsed
$days_elapsed = floor($secs / $sec_per_day);

// how many seconds passed today
$today_seconds = date('G')*3600 + date('i') * 60 + date('s');

// how many seconds passed in the final day calculation
$remain_seconds = $secs % $sec_per_day;

if($today_seconds < $remain_seconds)
{
    $days_elapsed++;
}

echo 'The event was '.$days_ago.' days ago.';

Это не идеально, если вы беспокоитесь о прыжок секунд и летнее время.

1
ответ дан Frank Forte 21 August 2018 в 04:14
поделиться
$time_elapsed = timeAgo($time_ago); //The argument $time_ago is in timestamp (Y-m-d H:i:s)format.

//Function definition

function timeAgo($time_ago)
{
    $time_ago = strtotime($time_ago);
    $cur_time   = time();
    $time_elapsed   = $cur_time - $time_ago;
    $seconds    = $time_elapsed ;
    $minutes    = round($time_elapsed / 60 );
    $hours      = round($time_elapsed / 3600);
    $days       = round($time_elapsed / 86400 );
    $weeks      = round($time_elapsed / 604800);
    $months     = round($time_elapsed / 2600640 );
    $years      = round($time_elapsed / 31207680 );
    // Seconds
    if($seconds <= 60){
        return "just now";
    }
    //Minutes
    else if($minutes <=60){
        if($minutes==1){
            return "one minute ago";
        }
        else{
            return "$minutes minutes ago";
        }
    }
    //Hours
    else if($hours <=24){
        if($hours==1){
            return "an hour ago";
        }else{
            return "$hours hrs ago";
        }
    }
    //Days
    else if($days <= 7){
        if($days==1){
            return "yesterday";
        }else{
            return "$days days ago";
        }
    }
    //Weeks
    else if($weeks <= 4.3){
        if($weeks==1){
            return "a week ago";
        }else{
            return "$weeks weeks ago";
        }
    }
    //Months
    else if($months <=12){
        if($months==1){
            return "a month ago";
        }else{
            return "$months months ago";
        }
    }
    //Years
    else{
        if($years==1){
            return "one year ago";
        }else{
            return "$years years ago";
        }
    }
}
23
ответ дан High6 21 August 2018 в 04:14
поделиться
  • 1
    так много if / else .... это не повлияет на время рендеринга php ??? – sonam Sharma 4 August 2015 в 08:21
  • 2
    Я не думаю, что это повлияет заметным образом. stackoverflow.com/questions/7895966/… Но я понимаю, что, по прошествии времени и события уже говорят, как и «месяцев назад», , он должен будет проверить много ifs (секунды, минуты, часы, дни, недели). Поэтому я предлагаю вам обернуть эти разделы if с помощью другого внешнего, если будет указано, что ($ seconds & lt; = 604800). Таким образом, случай с месяцами назад не должен будет проверять еще 4 случая ... снова, случаи, которые меньше, чем месяцы, будут иметь дополнительные, если ... выбор за вами. – Captain Red 4 August 2015 в 14:19

просто передают время для этой функции. он будет распечатывать для вас формат времени

date_default_timezone_set('your-time-zone');
function convert($datetime){
  $time=strtotime($datetime);
  $diff=time()-$time;
  $diff/=60;
  $var1=floor($diff);
  $var=$var1<=1 ? 'min' : 'mins';
  if($diff>=60){
    $diff/=60;
    $var1=floor($diff);
    $var=$var1<=1 ? 'hr' : 'hrs';
    if($diff>=24){$diff/=24;$var1=floor($diff);$var=$var1<=1 ? 'day' : 'days';
    if($diff>=30.4375){$diff/=30.4375;$var1=floor($diff);$var=$var1<=1 ? 'month' : 'months';
    if($diff>=12){$diff/=12;$var1=floor($diff);$var=$var1<=1 ? 'year' : 'years';}}}}
    echo $var1,' ',$var,' ago';
  }
-2
ответ дан hrishi 21 August 2018 в 04:14
поделиться

Я не знаю, почему никто пока не упоминает Carbon.

https://github.com/briannesbitt/Carbon

Это на самом деле расширение до php dateTime (которое уже использовалось здесь), и оно имеет метод diffforHumans. Итак, все, что вам нужно сделать, это:

$dt = Carbon::parse('2012-9-5 23:26:11.123789');
echo $dt->diffForHumans();

еще примеры: http://carbon.nesbot.com/docs/#api-humandiff

Плюсы этого решения:

  • он работает для будущих дат и вернет что-то вроде через 2 месяца и т. Д.
  • вы можете использовать локализацию для получения других языков и работы по плюрализации fine
  • , если вы начнете использовать Carbon для других вещей, работающих с датами, будет так же просто, как никогда.
8
ответ дан Krzysztof Duszczyk 21 August 2018 в 04:14
поделиться

Использование:

echo elapsed_time('2016-05-09 17:00:00'); // 18 saat 8 dakika önce yazıldı.

Функция:

function elapsed_time($time){// Nekadar zaman geçmiş

        $diff = time() - strtotime($time); 

        $sec = $diff;
        $min = floor($diff/60);
        $hour = floor($diff/(60*60));
        $hour_min = floor($min - ($hour*60));
        $day = floor($diff/(60*60*24));
        $day_hour = floor($hour - ($day*24));
        $week = floor($diff/(60*60*24*7));
        $mon = floor($diff/(60*60*24*7*4));
        $year = floor($diff/(60*60*24*7*4*12));

        //difference calculate to string
        if($sec < (60*5)){
            return 'şimdi yazıldı.';
        }elseif($min < 60){
            return 'biraz önce yazıldı.';
        }elseif($hour < 24){
            return $hour.' saat '.$hour_min.' dakika önce yazıldı.';
        }elseif($day < 7){
            if($day_hour!=0){$day_hour=$day_hour.' saat ';}else{$day_hour='';}
            return $day.' gün '.$day_hour.'önce yazıldı.';
        }elseif($week < 4){
            return $week.' hafta önce yazıldı.';
        }elseif($mon < 12){
            return $mon.' ay önce yazıldı.';
        }else{
            return $year.' yıl önce yazıldı.';
        }
    }
-1
ответ дан Limitless isa 21 August 2018 в 04:14
поделиться

Вам нужно будет взять каждый отдельный фрагмент вашей метки времени и преобразовать его во время Unix. Например, для timestamp, 2009-09-12 20:57:19.

(((2008-1970) * 365) + (8 * 30) +12) * 24 + 20 даст вам ROUGH оценка часов с 1 января 1970 года.

Возьмите это число, умножьте на 60 и добавьте 57 для получения минут.

Возьмите это, умножьте на 60 и добавьте 19 .

Это могло бы преобразовать его очень грубо и неточно.

Есть ли причина, по которой вы не можете просто начать обычное время Unix?

0
ответ дан LukeWarm74 21 August 2018 в 04:14
поделиться
  • 1
    лучше ли хранить в unix время в таблице sql? Я использую автоматическое обновление timestamp mysqls в настоящее время на столбце timestamp (который можно изменить на unix). Я просто изучаю, что лучше? – willdanceforfun 13 September 2009 в 03:49
  • 2
    Определенно. Я считаю, что значение по умолчанию для таблицы mySQL - это тип, на который вы ссылались, но время Unix намного практичнее. Вы всегда можете сохранить его как int. – LukeWarm74 13 September 2009 в 03:55
  • 3
    Опять же, решения Дава тоже хорошо работают. XD – LukeWarm74 13 September 2009 в 03:56
  • 4
    В вашей базе данных должна быть функция для преобразования даты в формат UNIX. В mysql вы используете UNIX_TIMESTAMP (). Да, и вы обычно должны хранить свои даты как DATETIME, а не INT, чтобы вы могли использовать функции sql для обработки даты. – CpnCrunch 23 September 2013 в 21:43
  • 5
    Вы никогда не должны использовать математику вовремя. Вы принимаете фиксированный календарь, которого нет. Используйте объект Date, предоставленный в php, для работы с ... датами. – Chris Baker 13 September 2014 в 01:43
$time_ago = ' ';
$time = time() - $time; // to get the time since that moment
$tokens = array (
31536000 => 'year',2592000 => 'month',604800 => 'week',86400 => 'day',3600 => 'hour',
60  => 'minute',1 => 'second');
foreach ($tokens as $unit => $text) {
if ($time < $unit)continue;
$numberOfUnits = floor($time / $unit);
$time_ago = ' '.$time_ago. $numberOfUnits.' '.$text.(($numberOfUnits>1)?'s':'').'  ';
$time = $time % $unit;}echo $time_ago;
-1
ответ дан Mehreen Jamil 21 August 2018 в 04:14
поделиться

Я нашел результаты, подобные следующим уродливым:

1 год, 2 месяца, 0 дней, 0 часов, 53 минут и 1 секунда

из того, что я реализовал функцию, которая учитывает множественные числа, удаляет пустые значения и, возможно, можно сократить результат:

function since($timestamp, $level=6) {
    global $lang;
    $date = new DateTime();
    $date->setTimestamp($timestamp);
    $date = $date->diff(new DateTime());
    // build array
    $since = json_decode($date->format('{"year":%y,"month":%m,"day":%d,"hour":%h,"minute":%i,"second":%s}'), true);
    // remove empty date values
    $since = array_filter($since);
    // output only the first x date values
    $since = array_slice($since, 0, $level);
    // build string
    $last_key = key(array_slice($since, -1, 1, true));
    $string = '';
    foreach ($since as $key => $val) {
        // separator
        if ($string) {
            $string .= $key != $last_key ? ', ' : ' ' . $lang['and'] . ' ';
        }
        // set plural
        $key .= $val > 1 ? 's' : '';
        // add date value
        $string .= $val . ' ' . $lang[ $key ];
    }
    return $string;
}

Выглядит намного лучше:

1 год, 2 месяца, 53 минуты и 1 секунду

При необходимости используйте $level = 2, чтобы сократить его следующим образом:

1 год и 2 месяца

< / blockquote>

Удалите часть $lang, если она вам нужна только на английском языке или отредактируйте этот перевод в соответствии с вашими потребностями:

$lang = array(
    'second' => 'Sekunde',
    'seconds' => 'Sekunden',
    'minute' => 'Minute',
    'minutes' => 'Minuten',
    'hour' => 'Stunde',
    'hours' => 'Stunden',
    'day' => 'Tag',
    'days' => 'Tage',
    'month' => 'Monat',
    'months' => 'Monate',
    'year' => 'Jahr',
    'years' => 'Jahre',
    'and' => 'und',
);
7
ответ дан mgutt 21 August 2018 в 04:14
поделиться
  • 1
    Из всего этого он работает хорошо для меня. Хотя он не показывает, чтобы идти или назад, но работает в обоих направлениях. Простое исправление: if ($ date- & gt; инвертировать & gt; 0) {$ end = & quot; идти "; } else {$ end = & quot; назад & Quot ;; } Просто добавьте $ end в строку $. – Quentin Campbell 18 April 2018 в 14:48

Немного измененный ответ сверху:

  $commentTime = strtotime($whatever)
  $today       = strtotime('today');
  $yesterday   = strtotime('yesterday');
  $todaysHours = strtotime('now') - strtotime('today');

private function timeElapsedString(
    $commentTime,
    $todaysHours,
    $today,
    $yesterday
) {
    $tokens = array(
        31536000 => 'year',
        2592000 => 'month',
        604800 => 'week',
        86400 => 'day',
        3600 => 'hour',
        60 => 'minute',
        1 => 'second'
    );
    $time = time() - $commentTime;
    $time = ($time < 1) ? 1 : $time;
    if ($commentTime >= $today || $commentTime < $yesterday) {
        foreach ($tokens as $unit => $text) {
            if ($time < $unit) {
                continue;
            }
            if ($text == 'day') {
                $numberOfUnits = floor(($time - $todaysHours) / $unit) + 1;
            } else {
                $numberOfUnits = floor(($time)/ $unit);
            }
            return $numberOfUnits . ' ' . $text . (($numberOfUnits > 1) ? 's' : '') . ' ago';
        }
    } else {
        return 'Yesterday';
    }
}
0
ответ дан Mr Sorbose 21 August 2018 в 04:14
поделиться
function time_elapsed_string($ptime)
{
    $etime = time() - $ptime;

    if ($etime < 1)
    {
        return '0 seconds';
    }

    $a = array( 365 * 24 * 60 * 60  =>  'year',
                 30 * 24 * 60 * 60  =>  'month',
                      24 * 60 * 60  =>  'day',
                           60 * 60  =>  'hour',
                                60  =>  'minute',
                                 1  =>  'second'
                );
    $a_plural = array( 'year'   => 'years',
                       'month'  => 'months',
                       'day'    => 'days',
                       'hour'   => 'hours',
                       'minute' => 'minutes',
                       'second' => 'seconds'
                );

    foreach ($a as $secs => $str)
    {
        $d = $etime / $secs;
        if ($d >= 1)
        {
            $r = round($d);
            return $r . ' ' . ($r > 1 ? $a_plural[$str] : $str) . ' ago';
        }
    }
}
100
ответ дан Pablo 21 August 2018 в 04:14
поделиться
  • 1
    Это нехорошее решение, так как оно использует 30days for month и 12x30days for year, и из-за этого оно вернет недопустимое число лет назад & lt; = 1978. Пример , где он возвращает 39 лет , но это должно 38. И это также не работает годами 1970 года. – Glavić 2 October 2013 в 13:33
  • 2
    Ужасное решение. Почему у этого есть 42 ответа и ответ? С каких это пор у каждого месяца есть 30 дней? – BadHorsie 14 March 2014 в 19:22
  • 3
    @ vassimboy, не могли бы вы рассказать мне, почему вы хотите проголосовать за мой ответ. если мой ответ не достаточно хорош, вы можете написать комментарий, чтобы исправить его без голосования. – Ayman Hussein 22 October 2014 в 10:15
  • 4
    Ваш ответ не подходит, потому что он рассчитан на 30 дней в месяц, а не на все месяцы - 30 дней. Прочтите другие комментарии выше. – Tomas Gonzalez 4 November 2014 в 19:47
  • 5
    Это функция, которая возвращает общую фразу, например «примерно, как давно был сделан этот комментарий»? Это неточно и имеет некоторые недостатки, как упоминалось выше, но для дат в недалеком прошлом (скажем, 30 лет назад и меньше) это дает нам неточное представление о том, как давно произошло событие. Хорошо работал для моего приложения. – Tim Dearborn 27 September 2015 в 13:17

Это действительно лучшее решение, которое я нашел. Использует jQuery, однако он отлично работает. Также он автоматически обновляется подобно тому, как SO и Facebook делают это, поэтому вам не нужно обновлять страницу, чтобы увидеть обновления.

Этот плагин прочитает ваш datetime attr в теге <time> и заполнит его для вас.

e.g. "4 minutes ago" or "about 1 day ago

http://timeago.yarp.com/

19
ответ дан Panama Jack 21 August 2018 в 04:14
поделиться
  • 1
    Это в значительной степени решило мою проблему. :) – Jeiman 31 October 2015 в 17:25
  • 2
    не работает со временем IST – xamDev 7 January 2018 в 16:41
  • 3
    Прекрасная работа и отображение желаемого результата во время IST – Vivek 8 May 2018 в 12:48
# This function prints the difference between two php datetime objects
# in a more human readable form
# inputs should be like strtotime($date)
function humanizeDateDiffference($now,$otherDate=null,$offset=null){
    if($otherDate != null){
        $offset = $now - $otherDate;
    }
    if($offset != null){
        $deltaS = $offset%60;
        $offset /= 60;
        $deltaM = $offset%60;
        $offset /= 60;
        $deltaH = $offset%24;
        $offset /= 24;
        $deltaD = ($offset > 1)?ceil($offset):$offset;      
    } else{
        throw new Exception("Must supply otherdate or offset (from now)");
    }
    if($deltaD > 1){
        if($deltaD > 365){
            $years = ceil($deltaD/365);
            if($years ==1){
                return "last year"; 
            } else{
                return "<br>$years years ago";
            }   
        }
        if($deltaD > 6){
            return date('d-M',strtotime("$deltaD days ago"));
        }       
        return "$deltaD days ago";
    }
    if($deltaD == 1){
        return "Yesterday";
    }
    if($deltaH == 1){
        return "last hour";
    }
    if($deltaM == 1){
        return "last minute";
    }
    if($deltaH > 0){
        return $deltaH." hours ago";
    }
    if($deltaM > 0){
        return $deltaM." minutes ago";
    }
    else{
        return "few seconds ago";
    }
}
-1
ответ дан Ramesh 21 August 2018 в 04:14
поделиться

Я знаю, что здесь есть несколько ответов, но это то, что я придумал. Это относится только к значениям MySQL DATETIME в соответствии с исходным вопросом, на который я отвечал. Массив $ a нуждается в некоторой работе. Я приветствую комментарии о том, как улучшить. Вызвать как:

echo time_elapsed_string ('2014-11-14 09:42:28');

function time_elapsed_string($ptime)
{
    // Past time as MySQL DATETIME value
    $ptime = strtotime($ptime);

    // Current time as MySQL DATETIME value
    $csqltime = date('Y-m-d H:i:s');

    // Current time as Unix timestamp
    $ctime = strtotime($csqltime); 

    // Elapsed time
    $etime = $ctime - $ptime;

    // If no elapsed time, return 0
    if ($etime < 1){
        return '0 seconds';
    }

    $a = array( 365 * 24 * 60 * 60  =>  'year',
                 30 * 24 * 60 * 60  =>  'month',
                      24 * 60 * 60  =>  'day',
                           60 * 60  =>  'hour',
                                60  =>  'minute',
                                 1  =>  'second'
    );

    $a_plural = array( 'year'   => 'years',
                       'month'  => 'months',
                       'day'    => 'days',
                       'hour'   => 'hours',
                       'minute' => 'minutes',
                       'second' => 'seconds'
    );

    foreach ($a as $secs => $str){
        // Divide elapsed time by seconds
        $d = $etime / $secs;
        if ($d >= 1){
            // Round to the next lowest integer 
            $r = floor($d);
            // Calculate time to remove from elapsed time
            $rtime = $r * $secs;
            // Recalculate and store elapsed time for next loop
            if(($etime - $rtime)  < 0){
                $etime -= ($r - 1) * $secs;
            }
            else{
                $etime -= $rtime;
            }
            // Create string to return
            $estring = $estring . $r . ' ' . ($r > 1 ? $a_plural[$str] : $str) . ' ';
        }
    }
    return $estring . ' ago';
}
1
ответ дан rdpcoder 21 August 2018 в 04:14
поделиться

Я пробовал это и отлично работал для меня

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-10');
$difference = $datetime1->diff($datetime2);
echo formatOutput($difference);

function formatOutput($diff){
    /* function to return the highrst defference fount */
    if(!is_object($diff)){
        return;
    }

    if($diff->y > 0){
        return $diff->y .(" year".($diff->y > 1?"s":"")." ago");
    }

    if($diff->m > 0){
        return $diff->m .(" month".($diff->m > 1?"s":"")." ago");
    }

    if($diff->d > 0){
        return $diff->d .(" day".($diff->d > 1?"s":"")." ago");
    }

    if($diff->h > 0){
        return $diff->h .(" hour".($diff->h > 1?"s":"")." ago");
    }

    if($diff->i > 0){
        return $diff->i .(" minute".($diff->i > 1?"s":"")." ago");
    }

    if($diff->s > 0){
        return $diff->s .(" second".($diff->s > 1?"s":"")." ago");
    }
}

Проверьте эту ссылку для ссылки здесь

Спасибо! и получайте удовольствие.

1
ответ дан Ruberandinda Patience 21 August 2018 в 04:14
поделиться

Эта функция не используется для английского языка. Я перевел слова на английском языке. Это необходимо для большей фиксации перед использованием на английском языке.

function ago($d) {
$ts = time() - strtotime(str_replace("-","/",$d));

        if($ts>315360000) $val = round($ts/31536000,0).' year';
        else if($ts>94608000) $val = round($ts/31536000,0).' years';
        else if($ts>63072000) $val = ' two years';
        else if($ts>31536000) $val = ' a year';

        else if($ts>24192000) $val = round($ts/2419200,0).' month';
        else if($ts>7257600) $val = round($ts/2419200,0).' months';
        else if($ts>4838400) $val = ' two months';
        else if($ts>2419200) $val = ' a month';


        else if($ts>6048000) $val = round($ts/604800,0).' week';
        else if($ts>1814400) $val = round($ts/604800,0).' weeks';
        else if($ts>1209600) $val = ' two weeks';
        else if($ts>604800) $val = ' a week';

        else if($ts>864000) $val = round($ts/86400,0).' day';
        else if($ts>259200) $val = round($ts/86400,0).' days';
        else if($ts>172800) $val = ' two days';
        else if($ts>86400) $val = ' a day';

        else if($ts>36000) $val = round($ts/3600,0).' year';
        else if($ts>10800) $val = round($ts/3600,0).' years';
        else if($ts>7200) $val = ' two years';
        else if($ts>3600) $val = ' a year';

        else if($ts>600) $val = round($ts/60,0).' minute';
        else if($ts>180) $val = round($ts/60,0).' minutes';
        else if($ts>120) $val = ' two minutes';
        else if($ts>60) $val = ' a minute';

        else if($ts>10) $val = round($ts,0).' second';
        else if($ts>2) $val = round($ts,0).' seconds';
        else if($ts>1) $val = ' two seconds';
        else $val = $ts.' a second';


        return $val;
    }
0
ответ дан shnisaka 21 August 2018 в 04:14
поделиться

Первоначально написано и доступно на этой ссылке

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 (), и оно сообщит вам, сколько секунд / минут / часов / дней / лет / десятилетия назад.

-2
ответ дан Usman Shaukat 21 August 2018 в 04:14
поделиться

Вы можете использовать:

date("Y-m-d H:i:s",strtotime("1 day ago"));
-2
ответ дан William Wong Garay 21 August 2018 в 04:14
поделиться
0
ответ дан vinay chaubey 31 October 2018 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: