2016-03-24 17 views
1

私は、データベースにレコードを保存してから4時間後にcronでPHPスクリプトを実行しようとしています。私の問題はここではcronではなく、ここではうまくいきます(デーモンcronから4時間ごとにテストメールを受け取っているので、これは間違いありません)。タイムスタンプunix時刻と時刻()の違いが間違っているのはなぜですか?

問題は、タイムスタンプとunixに変換された時刻と現在の時刻との差異を計算してから、いくつかのスクリプトを実行するときです。

しかし、これらの2つの時間の差は3時間以上あり、理由はわかりませんが、スクリプトは4時間ではなく7時間後に実行されます。誰も私を助けることができますか?

私のコードは次のようになります。

<?php 
require_once('some-path/wp-load.php'); 
global $wpdb; 
    $constant= 4*3600; 
    $table = 'notifications'; 
    $data = $wpdb->get_results("SELECT * FROM $table WHERE status = 'pending'"); 
    $time = time(); 

foreach ($data as $r){ 
    $temp_data = strtotime($r->date_created); 
    if ($time - $temp_data > $constant){ 
     $email = $r->email; 
     $message = 'test'; 
     $subject = 'test'; 
     $headers = 'From: test <[email protected]>' . "\r\n"; 
     $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; 
     $mail_client = wp_mail($email, $subject, $message, $headers); 
     if($mail_client){ 
      $wpdb->update($tabel, array('status' => 'sent'), array('id_raport'=>$r->id_raport), array('%s'), array('%d')); 
     } 
    } 
} 

日付の例データベースから今Using strtotime(): 1458814621, Directly from database "2016-03-24 10:17:01"

、私は本当のlocaltimeを取得するには、このような何かを行うことができます知っている:

date_default_timezone_set('Europe/Bucharest'); 
    $date = date('m/d/Y h:i:s a', time()); 
    $time = strtotime($date); 

更新。 しかし、これはtime()メソッドと同じことを返します。今

+0

データベースから返されるdate_createdのいくつかのバージョンを提供できますか? –

+4

あなたのタイムゾーンはUTCから3時間ですか? –

+0

@ LiamSorsby、私はあなたの質問に私の質問の最後に追加しました。それが役に立てば幸い。ありがとう。 – Ionut

答えて

3

、私は本当のlocaltimeを取得するには、このような何かを行うことができます知っている:

date_default_timezone_set('Europe/Bucharest'); 
$date = date('m/d/Y h:i:s a', time()); 
$time = strtotime($date); 

UNIXタイムスタンプが "ローカル" ではありません。 UNIXのタイムスタンプは世界中で同じです。このコードでは、タイムスタンプ(time())を人間が判読可能な形式に変換し、それをタイムスタンプに再解釈するだけです。結果は元のtime()の値と同じです(または少なくとも!)。あなたは、MySQL(2016-03-24 10:17:01)から受け取るよう

人間が読める形式の日付/時刻の形式は、タイムゾーンのない不完全です。 24時間以上の異なる絶対的な時点があり、それは "2016-03-24 10:17:01" のどこかで、世界ではです。そのタイムスタンプ自体はあまり意味がありません。
strtotimeを使用してUNIXタイムスタンプに変換する場合は、あいまいな相対時間形式を絶対時点に変換するための追加情報が必要です。その情報はdate_default_timezone_setか、php.iniに等価的に設定されているものです。

あなたの問題はほぼ確実にPHPがタイムゾーンに沸きます。strtotimeはMySQLのdatetime文字列と同じタイムゾーンではないと仮定しています。たとえば、MySQLの日時がUTCの時刻を表していて、strtotimeが使用する時間帯としてブカレストを使用している場合は、結果の絶対時刻に数時間の差が表示されます。

PHPコードで正しいタイムゾーンを設定または使用するだけです。程度/ MySQLの日付が実際に格納されているどのようなタイムゾーンを決定/注意してください。

また考えるDoes PHP time() return a GMT/UTC Timestamp?

+0

はい、あなたは正しいですが、time()と私が持っていたものは全く同じUNIX値を返しています。 – Ionut

+0

ここに私の代わりに何がありますか? – Ionut

+0

どのような選択肢が必要ですか? 1)MySQLのタイムスタンプがどのタイムゾーンにあるかを調べる/判断する/考慮する/瞑想する。2) 'date_default_timezone_set'を使ってタイムゾーンを設定する。 3)MySQLのタイムスタンプを 'strtotime'を使ってUNIXのタイムスタンプを修正するように変換します。 - それはあなたのために働かないのですか? – deceze

1

time()から返された値(タイムスタンプ)を参照してください1970年1月1日、00からの秒数です:00:00 UTC。それは絶対値です。

データベースから取得する値(2016-03-24 10:17:01)は相対値です。使用するタイムゾーンに応じて、異なるタイムスタンプを表すことができます。あなたは、データベースから抽出日時の値が不完全である

// Timestamp generated from PHP code 
// Current time 
$date1 = new DateTime(); // it uses the default timezone set in php.ini 
          // or by a previous call to date_default_timezone_set() 
// be more specific 
$date2 = new DateTime('now', new DateTimeZone('US/Eastern')); 
// $date1 and $date2 represent the same moment in time ("now") 
echo(($date1 == $date2) ? 'Yes' : 'No'); // It displays "Yes" 
// Display them as timestamps 
echo($date1->format('U'));  // 1458816551 
echo($date2->format('U'));  // also 1458816551 
// Display $date1 as human-readable format: 
echo($date1->format('Y-m-d H:i:s e')); 
// It displays: 2016-03-24 12:49:11 Europe/Bucharest 
// Change $date1 to use the same timezone as $date2 
$date1->setTimezone(new DateTimeZone('US/Eastern')); 
echo($date1->format('Y-m-d H:i:s e')); 
// Now it displays: 2016-03-24 06:49:11 US/Eastern 

// It provides easy ways to generate another date: 
$date3 = clone $date1;  // create a duplicate 
$date3->add(new DateInterval('P2D')); // modify the duplicate 
// $date3 is 2 days in the future 
echo($date3->format('Y-m-d H:i:s e')); 
// It displays: 2016-03-26 06:49:11 US/Eastern 

// Get the difference between $date3 and $date1 
$diff = $date3->diff($date1) 
// you get the difference in date components (days, hours, minutes etc). 
print_r($diff); 

:どのようにDateTimeDateTimeZoneクラスを使用する

。それはタイムゾーンが欠けている。過去にデータベースに値を格納していた場合は、使用するタイムゾーンを知る必要があります。 SELECT NOW()を使用してデータベースからdatetimeを取得した場合、タイムゾーンはサーバーによって使用されるデフォルトのタイムゾーンです。それはsystem_time_zoneサーバー変数に格納され、SELECT @@system_time_zone

でクエリを照会することができます。

SELECT NOW() AS now, @@system_time_zone AS tz 

は、ローカルの日付と時刻とMySQLサーバが使用するタイムゾーンを返します。

上記のサンプルコードのように、これらを使用して、DateTimeオブジェクトを作成できます。

通常、データベースに格納する値には、常にdatetimeという値を1回使用します。私はUTCを使用することをお勧めします。なぜならすべてがそれに関連しており、DSTを観察しないからです。または、タイプTIMESTAMPの列を使用することもできます(絶対タイムスタンプはタイムゾーンとDSTを気にしませんが)。

関連する問題