0

我正在尝试设置数据库条目的过期时间。我已将该字段设置为datetime并通过 MySQL 手动输入了一些值

我从表中获取值并将其转换为strtotime(). 然后我得到当前时间使用strtotime("now"); 或time();他们似乎返回相同的值。

然后我取未来日期(来自数据库的日期)并使用 if 语句检查它是否小于当前时间,如果是,我将其设置为过期。如果它仍然大于当前时间,我会返回还剩多少时间..

这是代码:

$time_left = "";
$value['ex_date'] = '2012-11-22 18:17:33';// this is whats in the DB now.
$future_time = strtotime($value['ex_date']);
$now_time = strtotime('now');

if($deal_end < $now_time){
    $time_left = 'Expired';
}else{
    $seconds = $future_time - $now_time;
    $days = floor($seconds / 86400);
    $seconds %= 86400;
    $hours = floor($seconds / 3600);
    $seconds %= 3600;
    $minutes = floor($seconds / 60);
    $seconds %= 60;

    if($days >= 1) {$time_left .= "D:$day ";}
    if($hours >= 1) {$time_left .= "H:$hours ";}
    if($minutes >= 1) {$time_left .= "M:$minutes ";}
    if($seconds >= 1) {$time_left .= "S:$seconds ";}

由于某种原因,上述方法效果不佳。它就像有一些时间差距。

我的问题是:有没有办法检查服务器时间与数据库时间?

因为由于strtotime('now');某种原因,时间似乎与当前时间温度相差 2/3 小时。

4

3 回答 3

0

我可以建议另外两种方法
:从尚未过期但将逻辑添加到查询本身的数据库行中选择
b。每分钟运行一次 cron/mysql 计划,这将清除已过期的数据库条目

SELECT * from TABLE where X = Y and NOW() < expiredField


此外,PHP 有一个内置类,仅用于您尝试执行的日期操作。
它被称为DateTime

$dt = new DateTime('2012-11-22 18:17:33');
$dtNow = new DateTime();

$interval = $dtNow->diff($dt); // php.net/DateInterval
if($interval->invert) 
    echo 'expired';
else 
    echo $interval->format('%m month, %d days, %h hours, %s seconds');

对于你原来的问题

检查服务器时间是 echo time();
检查数据库时间是 SELECT NOW();

于 2012-11-22T10:35:19.267 回答
0

您可以在命令行使用以下命令查找服务器(linux)时区:

$ date +%Z

或者在 php 中:

$ echo system('date +%Z');

在php中你可以使用date_default_timezone_get函数。

很可能您的时区systemphp时区会有所不同。

php您可以使用date_default_timezone_set 函数更改时区。

于 2012-11-22T10:39:22.163 回答
0

万一有人对我如何解决它感到好奇:

$result = mysql_query("select CURRENT_TIMESTAMP;");
$row = mysql_fetch_array( $result );
$DB_now = $row['CURRENT_TIMESTAMP'];



$deal_end = strtotime($value['ex_date']);
$now_time = strtotime($DB_now);

我只是使用数据库的当前时间戳作为“现在”不确定这是否是最好的解决方案,但它可以工作

于 2012-11-22T14:38:40.020 回答