time() 和 date() 时间更改后的问题(DST - 标准)



在PHP中,我想输出一个HTML选项列表,其中包含未来14天的日期。

这些约会总是在 18 点钟位置:

$today_day = date('d');
$today_month = date('m');
$today_year = date('Y');
$date_entry = mktime(18, 00, 00, $today_month, $today_day, $today_year);
$optionsStr = '<select name="date">';
for ($d = 1; $d < 14; $d++) {
    $date_entry_temp = $date_entry+86400*$d;
    $optionsStr .= '<option value="'.$date_entry_temp.'">'.date('d.m.Y', $date_entry_temp).'</option>';
}
$optionsStr .= '</select>';
echo $optionsStr;

然后,用户可以从这些日期之一中进行选择并提交表单。然后将所选时间戳插入到数据库中。

所以我的数据库中有一些条目。

在另一页上有一个当前约会的列表:

mysql_query("SELECT id, name FROM appointments WHERE date_time = ".time());

因此,在 18 点钟应该有一些输出,因为数据库中有当天的条目。在时间从 DST 更改为标准时间之前,这非常有效,反之亦然。那么,确实是错误的:

约会分别显示晚一小时或太早。

如何解决这个问题?

mktime() 创建一个 unix 时间戳。unix 时间戳是从 1970 年 1 月 1 日 00:00:00 GMT +0000 开始的秒数。(格林威治时间)

当您将时区设置为"欧洲/柏林"时,时区为 GMT+0100(冬季)或 GMT+0200(夏季)。这意味着当您有 DST 时,您的约会的格林威治时间会更改一小时。这意味着更改前的第一次约会和更改后的下一次约会之间的时间不是 24 小时,而是 23 或 25 小时。但是,您可以通过添加 86400 秒 = 24 小时来生成约会。

您可以改用 DateTime 对象和 add() 方法。它考虑了 DST 更改。

// create a new date object with todays date
$date = new DateTime();
// set the time to 18:00
$date->setTime(18,0,0);
$optionsStr = '<select name="date">';
for ($i = 0; $i < 14; $i++) {
    // add 1 day
    $date->add(new DateInterval('P1D'));
    $optionsStr .= '<option value="'.$date->format('U').'">'.$date->format('d.m.Y').'</option>';
}
$optionsStr .= '</select>';
echo $optionsStr;

有关详细信息,请参阅 http://www.php.net/manual/en/datetime.add.php。

您的主要问题是您没有在 GMT 日期工作。这是一篇色彩缤纷的帖子,突出了由此产生的陷阱:

http://derickrethans.nl/storing-date-time-in-database.html

您应该做的是,以时区 UTC 存储约会日期时间,以时区 UTC 比较日期时间,并以您(确定)或其(理想)首选时区向用户显示日期时间。

似乎您对时区有问题:http://dev.mysql.com/doc/refman/5.0/en/timestamp.html我会选择时间,从您的本地时间转换为 UTC,然后将其放入数据库中。如果您读出它,请从 UTC 转换回您的当地时间。

当依赖时间时,请确保始终在 php 或代码中设置时区.ini。 而且,对于数据库条目,您无能为力,如果您按时间或日期对它们进行排序,它们最终将被交错,因为新日期在时间更改之前的最后一个条目的日期之前。

最新更新