时间变化后的时间()和日期()问题(DST - 标准)

时间:2011-05-11 12:37:06

标签: php date time 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变为标准时间,反之亦然。确实,这是错误的:

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

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

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

当您将时区设置为“Europe / Berlin”时,时区为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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

当依赖时间时,请确保您在php.ini或代码中始终设置了一个时区。对于您的数据库条目,您可以做很多事情,如果按时间或日期对它们进行排序,由于新日期早于时间变化之前的最后一次输入日期,它们将最终交错。