2016-05-29 5 views
0

私は、このタイムスタンプのPHPコードで正しい時刻を表示していません。それは時間が前に分であると思われるときに常に8時間前に表示されます。タイムスタンプを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

使用の炭素依存、これはタイムゾーン '「タイムゾーン」=> date_default_timezone_get()、私はあなたが何を意味するかを理解することを確認していない' –

答えて

7

ここで私はあなたのために書いた機能です。

PHPのバージョンが> = 5.3.0でなければならないので、それは、DateTime classを使用しています。

それがどのように動作するかを理解するための関数のコメントを読んでください。

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

ためeasyerそれを行います。あなたが書いたのは、**タイムゾーンを取得する**機能です。私が書いたのは**タイムゾーンを設定することです**。タイムゾーンを取得し、返されるタイムゾーンがfalseの場合は、あなたとは異なるタイムゾーンの時間が得られます。 –

+0

@DarkSterixのためであるあなた –

+0

関数が適切なタイムゾーンを返すので、なぜ1時間か2時間か分の代わりに8時間前に始まるのか分かりません。 –

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 
関連する問題