为什么时间戳记unix time和time()之间的时差不正确?

Ion*_*ula 1 php mysql sql

我试图在数据库中保存记录后4个小时用cron执行php脚本。我这里的问题不是cron,这里的一切都很好(我确定是因为我每4小时就会收到来自守护程序cron的测试邮件)。

问题是当我计算时间戳(转换为unix)与当前时间之间的差然后执行一些脚本时。

但是这两次之间的差异使它们增加了3个小时,我不知道为什么,但是我的脚本会在7个小时而不是4个小时后执行。谁能帮我吗?

我的代码如下所示:

<?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 <test@test.com>' . "\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'));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

来自数据库的日期示例 Using strtotime(): 1458814621, Directly from database "2016-03-24 10:17:01"

现在,我知道我可以做这样的事情来获取真实的本地时间:

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

更新。 但这返回与time()方法相同的东西。

dec*_*eze 5

现在,我知道我可以做这样的事情来获取真实的本地时间:

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

UNIX时间戳记不是“本地”的。UNIX时间戳在世界各地都是相同的。您在这段代码中所做的只是将时间戳(time())转换为人类可读的格式,然后将其重新解释为时间戳。结果与原始time()值相同(或至少应为原始值!)。

没有时区的人类可读的日期/时间格式(例如您从MySQL(2016-03-24 10:17:01)接收到的)是不完整的。在世界某个地方,有超过24个不同的绝对时间点是“ 2016-03-24 10:17:01” 。时间戳本身并不意味着什么。
当您使用转换为UNIX时间戳时strtotime,它必须吸收其他信息才能将这种模糊的相对时间格式转换为绝对时间点。该信息来自date_default_timezone_set,或在php.ini中等效设置的任何内容。

您的问题几乎可以肯定地归结为PHP假定的时strtotime区与您的MySQL datetime字符串实际所处的时区不同。例如,如果您的MySQL日期时间表示UTC的时间,但strtotime假定将布加勒斯特用作时区,则您将看到所产生的绝对时间点相差几个小时。

只需在您的PHP代码中设置/使用正确的时区;考虑/知道/决定您的MySQL日期实际存储在哪个时区。

另请参见PHP time()是否返回GMT / UTC时间戳?