Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 时间更改后的时间()和日期()问题(DST-标准)_Php_Date_Time_Dst - Fatal编程技术网

Php 时间更改后的时间()和日期()问题(DST-标准)

Php 时间更改后的时间()和日期()问题(DST-标准),php,date,time,dst,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 =

在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;
所以在18点应该有一些输出,因为数据库中有当天的条目。在时间从DST变为标准时间或从DST变为标准时间之前,这一点都非常有效。那么,事实上,这是错误的:

约会分别显示为迟到一小时或太早一小时


如何解决此问题?

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

似乎您在时区方面有问题: 我会选择时间,将本地时间转换为UTC,然后将其放入数据库。如果您读出它,请将其从UTC转换回本地时间。

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;
//使用今天的日期创建新的日期对象
$date=新的日期时间();
//把时间定在18点
$date->setTime(18,0,0);
$optionsStr='';
对于($i=0;$i<14;$i++){
//加1天
$date->add(新的日期间隔('P1D'));
$optionsStr.=''.$date->format('d.m.Y');
}
$optionsStr.='';
echo$optionssr;

有关更多信息,请参阅。

您的主要问题是您没有使用GMT日期。下面是一篇色彩鲜艳的文章,强调了由此产生的陷阱:


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

请停止在标题中写入标记。在你的112个问题中,你已经做了很多。对不起,我不知道有一个问题可以避免这个。对不起,我应该更仔细地阅读指南。18点,我相信你的意思是1800小时。(一千八百小时)不,我的意思是:18点,也就是下午6点。我总是在代码中使用date\u default\u timezone\u set(“欧洲/柏林”)设置时区。因为时间戳中的时间总是连续的,所以不应该有跳跃或重叠。因为我使用INT(10)列作为时间戳,所以时区应该没有问题,对吗?MySQL不知道这是一个时间戳,所以错误一定是在PHP中。顺便说一句,这并不会让计算变得更容易。事实上,原始海报已经用UTC存储了时间戳,而您链接的文章则建议相反:将时间存储在本地时间和时区中。(这里所说的“本地”是指“在活动地点”。通常活动在特定的时间在特定的地点,而不是在特定的格林威治时间)
// 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;