2016-05-29 2 views
0

У меня есть этот timestamp php-код, который не отображает правильное время. он всегда показывает 8 часов назад, когда время должно быть минут назад.Преобразование timestamp ко времени назад в PHP

/** 
 
    * Convert a timestap into timeago format 
 
    * @param time 
 
    * @return timeago 
 
    */ 
 

 
    public static function timeago($time, $tense = "ago"){ 
 
     if(empty($time)) return "n/a"; 
 
     $time=strtotime($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; 
 
     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] $tense "; 
 
    }

я не понимаю, почему он не работает должным образом

+0

что вход и выход, что вы ожидаете ? – naomik

+0

использовать зависимость от углерода, это облегчит вам –

ответ

7

Вот функция, я написал для вас.

Он использует DateTime class, поэтому версия PHP должна быть> = 5.3.0.

Прочитайте комментарии в функции, чтобы понять, как это работает.

function timeago($time, $tense='ago') { 
    // declaring periods as static function var for future use 
    static $periods = array('year', 'month', 'day', 'hour', 'minute', 'second'); 

    // checking time format 
    if(!(strtotime($time)>0)) { 
     return trigger_error("Wrong time format: '$time'", E_USER_ERROR); 
    } 

    // getting diff between now and time 
    $now = new DateTime('now'); 
    $time = new DateTime($time); 
    $diff = $now->diff($time)->format('%y %m %d %h %i %s'); 
    // combining diff with periods 
    $diff = explode(' ', $diff); 
    $diff = array_combine($periods, $diff); 
    // filtering zero periods from diff 
    $diff = array_filter($diff); 
    // getting first period and value 
    $period = key($diff); 
    $value = current($diff); 

    // if input time was equal now, value will be 0, so checking it 
    if(!$value) { 
     $period = 'seconds'; 
     $value = 0; 
    } else { 
     // converting days to weeks 
     if($period=='day' && $value>=7) { 
      $period = 'week'; 
      $value = floor($value/7); 
     } 
     // adding 's' to period for human readability 
     if($value>1) { 
      $period .= 's'; 
     } 
    } 

    // returning timeago 
    return "$value $period $tense"; 
} 

не забудьте установить часовой пояс вы работаете

date_default_timezone_set('UTC'); 

использовать его

echo timeago('1981-06-07'); // 34 years ago 
echo timeago(date('Y-m-d H:i:s')); // 0 seconds ago 

т.д.

+0

Спасибо, это решило мою проблему. –

1

Возможно ваш часовой пояс не установлен правильно! Перед тем, как время, попробуйте установить часовой пояс по умолчанию:

date_default_timezone_set (string $timezone_identifier) 

More about the function on PHP.net

List of Supported Timezones

+0

это для часового пояса '' часовой пояс "=> date_default_timezone_get(),' –

+0

@DarkSterix Я не уверен, что понимаю, что вы имеете в виду. То, что вы написали, это функция для ** получения ** часового пояса. Я написал для ** настройки ** часового пояса. Если вы получите часовой пояс, а часовой пояс возвращается, то вы получите время для другого часового пояса, чем ваш. –

+0

Поскольку функция возвращает правильный часовой пояс, я не понимаю, почему она начинается с 8 часов назад вместо 1 или 2 часов или минут –

0
function time_elapsed($datetime, $full = false) { 

$now = time(); 
$ago = strtotime($datetime); 

$diff = $now - $ago; 

$string = array(
    'year' => 31104000, 
    'month' => 2592000, 
    'week' => 604800, 
    'day' => 86400, 
    'hour' => 3600, 
    'minute'=> 60, 
    'second'=> 1 
); 

$data = array(); 

foreach ($string as $k => $v) { 

    if($diff > $v){ 
     $count = round($diff/$v); 
     $data[$k] = $count . (($count > 1) ? ' ' . $k .'s' : ' ' . $k); 
     $diff  = $diff % $v; 
    } 
} 

if (!$full) $data = array_slice($data, 0, 1); 
    return $data ? implode(', ', $data) . ' ago' : 'just now'; 
} 

echo time_elapsed('2016-01-18 13:07:30', true); 
     // 2 years, 1 month, 2 weeks, 6 days, 25 seconds ago 
echo time_elapsed('2016-01-18 13:07:30'); 
    // 2 years ago 
Смежные вопросы