2016-04-19 9 views
0

私が書いようとしているプログラムは、今日の2回とセッション変数に入れられたユーザログインの時間の差を見つけるだけで十分です。PHPセッション変数 - 時間差を見つける

ユーザーは、彼らが別のページにこのコードを使用して発見された中に記録されている期間をログアウトすると、セッション変数

$_SESSION['loginTime']; 

は今日の日付

$_SESSION['loginTime'] = date('Y-m-d H:i:s'); 

に設定されています:

if(isset($_SESSION['loginTime'])) 
{ 
    $logTime = $_SESSION['loginTime']; 

    $duration = strtotime(date('Y-m-d H:i:s')) - strtotime($logTime); 
    $duration = date('H:i:s', $duration); 

} 

ログインすると(22:15 19/04/2016)、1分10秒間ログインしたままですeturns 01:01:10。私は余分な時間がどこから来ているのか理解できません。すべての時間帯は同じに設定されています。

  • 分と秒は細かい計算されますが、1時間に読み取るため、一見何の理由もなく

感謝を追加します!どんな助けでも大歓迎です!

+0

'date'関数を実行する前に' $ duration'のunixタイムスタンプの値は何ですか? – Martin

+0

@Martinお返事ありがとうございます!あなたは夏時間を考慮する方法を知っていますか? – ilumo

+0

夏時間問題の場合は[gmdate](http://php.net/manual/en/function.gmdate.php)* – Martin

答えて

4

DateTimeオブジェクトはあなたの友人です。 PHP manualから

は、簡単な例は次のとおりです。

$datetime1 = new DateTime('2009-10-11'); 
$datetime2 = new DateTime('2009-10-13'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); 

あなたは簡単にこのような何かにあなたのコードを適応させることができます。

if(isset($_SESSION['loginTime'])) 
{ 
    $logTime = new \DateTime($_SESSION['loginTime']); 
    $currentTime = new \DateTime('now'); 
    $interval = $logTime->diff($currentTime); 
    $duration = $interval->format('%H:%i:%s'); 
} 
echo $duration; 

出力例:

15:48:57

+0

それは時間ですか?私はここで長すぎる!シュート、私は遅刻だ! – Martin

0

これはDSTとは関係ありません。これは一般的にタイムゾーンに関連しています。 $logTimenow()の違いは、OPの分のように通常小さいです。 dateの場合、1970年1月1日の時刻になります。ただし、GMTの00:00はヨーロッパ本土のほとんどの都市で01:00です。

date()の代わりにgmdate()を使用すると、秒の差分をH:i:sの形式に戻すことができます。適切な解決策は、DateTimeオブジェクトを使用し、diff関数を使用してDateIntervalを取得することです(David Wylyの説明を参照)。