我正在尝试在数据库中保存记录后 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'));
}
}
}
来自数据库的日期示例 使用 strtotime():1458814621,直接来自数据库“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);
更新。 但这返回与 time() 方法相同的东西。
最佳答案
Now, I know I can do something like this to get the real 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 日期时间字符串实际使用的时区不同。例如,如果您的 MySQL 日期时间表示 UTC 时间,但 strtotime
假定布加勒斯特作为要使用的时区,您将看到结果的绝对时间点有几个小时的差异。
只需在您的 PHP 代码中设置/使用正确的时区;考虑/注意/决定您的 MySQL 日期实际存储在哪个时区。
关于php - 为什么 timestamp unix time 和 time() 之间的区别不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36196075/