Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.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日期是4周前_Php_Datetime_Unix Timestamp_Dst - Fatal编程技术网

PHP日期是4周前

PHP日期是4周前,php,datetime,unix-timestamp,dst,Php,Datetime,Unix Timestamp,Dst,我有以下代码,结果输出20191027 如果我修改第二行,即将时区设置为奥克兰,则结果为20191028。为什么会这样 date_default_timezone_set("Europe/London"); #date_default_timezone_set("Pacific/Auckland"); $date_format = 'Ymd'; $day = "Sunday 4 week ago"; $start_of_the_week = strtotime($day); $next_

我有以下代码,结果输出20191027

如果我修改第二行,即将时区设置为奥克兰,则结果为20191028。为什么会这样

date_default_timezone_set("Europe/London");
#date_default_timezone_set("Pacific/Auckland");

$date_format =  'Ymd';

$day = "Sunday 4 week ago";
$start_of_the_week = strtotime($day);

$next_day = $start_of_the_week + (60 * 60 * 24 * 1);
$next_day = date($date_format, $next_day);

echo $next_day;
检查2个输出:

20191027 20191028
每个时区之间都有差异

比如说

印度比美国华盛顿特区提前10小时30分钟。如果这些时区的时间出现回声,结果会有所不同

在您的案例中,新西兰奥克兰比英国伦敦提前13小时,因此它给出了不同的O/p


希望这能解决您的问题:

每个时区之间都有差异

比如说

印度比美国华盛顿特区提前10小时30分钟。如果这些时区的时间出现回声,结果会有所不同

在您的案例中,新西兰奥克兰比英国伦敦提前13小时,因此它给出了不同的O/p


希望这能解决您的问题:

正如评论中所讨论的,问题是欧洲/伦敦在4周前的那一天完成了夏令时,因此在该时间上增加24小时只会让您提前23小时。通过使用DateTime对象并仅处理天,可以避免此类问题:

$date_format =  'Y-m-d H:i:s';
$day = "Sunday 4 week ago";

date_default_timezone_set("Europe/London");
$date = new DateTime($day);
$date->modify('+1 day');
echo $date->format($date_format) . "\n";

date_default_timezone_set("Pacific/Auckland");
$date = new DateTime($day);
$date->modify('+1 day');
echo $date->format($date_format) . "\n";
输出:

2019-10-28 00:00:00
2019-10-28 00:00:00
您也可以直接向DateTime构造函数指定时区:

$date_format =  'Y-m-d H:i:s';
$day = "Sunday 4 week ago";

$date = new DateTime($day, new DateTimeZone("Europe/London"));
$date->modify('+1 day');
echo $date->format($date_format) . "\n";

$date = new DateTime($day, new DateTimeZone("Pacific/Auckland"));
$date->modify('+1 day');
echo $date->format($date_format) . "\n";

正如评论中所讨论的,问题在于欧洲/伦敦在4周前的那一天完成了夏令时,因此在这一时间上增加24小时只需要提前23小时。通过使用DateTime对象并仅处理天,可以避免此类问题:

$date_format =  'Y-m-d H:i:s';
$day = "Sunday 4 week ago";

date_default_timezone_set("Europe/London");
$date = new DateTime($day);
$date->modify('+1 day');
echo $date->format($date_format) . "\n";

date_default_timezone_set("Pacific/Auckland");
$date = new DateTime($day);
$date->modify('+1 day');
echo $date->format($date_format) . "\n";
输出:

2019-10-28 00:00:00
2019-10-28 00:00:00
您也可以直接向DateTime构造函数指定时区:

$date_format =  'Y-m-d H:i:s';
$day = "Sunday 4 week ago";

$date = new DateTime($day, new DateTimeZone("Europe/London"));
$date->modify('+1 day');
echo $date->format($date_format) . "\n";

$date = new DateTime($day, new DateTimeZone("Pacific/Auckland"));
$date->modify('+1 day');
echo $date->format($date_format) . "\n";
在欧洲/伦敦时区

DST于2019年10月27日星期日凌晨2:00:00结束,当地时钟停止 倒退1小时

请记住,strotime是在unix时间戳上运行的,在unix时间戳上没有DST的概念,但是在格式化时,date函数会将unix时间戳调整为本地时区。因此:

$start_of_the_week = strtotime("Sunday 4 week ago"); // $start_of_the_week is some unix timestamp
echo date("Y-m-d H:i:s", $start_of_the_week);        // 2019-10-27 00:00:00 Europe/London time

$next_day = $start_of_the_week + (60 * 60 * 24 * 1); // you're adding 24 hours to a unix timestamp
echo date("Y-m-d H:i:s", $next_day);                 // 2019-10-27 23:00:00 Europe/London time
2019-10-27 23:00:00仍然是周日。解决方案是增加天数而不是小时:

$next_day = strtotime("+1 day", $start_of_the_week); // 2019-10-28 00:00:00
在欧洲/伦敦时区

DST于2019年10月27日星期日凌晨2:00:00结束,当地时钟停止 倒退1小时

请记住,strotime是在unix时间戳上运行的,在unix时间戳上没有DST的概念,但是在格式化时,date函数会将unix时间戳调整为本地时区。因此:

$start_of_the_week = strtotime("Sunday 4 week ago"); // $start_of_the_week is some unix timestamp
echo date("Y-m-d H:i:s", $start_of_the_week);        // 2019-10-27 00:00:00 Europe/London time

$next_day = $start_of_the_week + (60 * 60 * 24 * 1); // you're adding 24 hours to a unix timestamp
echo date("Y-m-d H:i:s", $next_day);                 // 2019-10-27 23:00:00 Europe/London time
2019-10-27 23:00:00仍然是周日。解决方案是增加天数而不是小时:

$next_day = strtotime("+1 day", $start_of_the_week); // 2019-10-28 00:00:00

我想我最不明白的是,当我说4周前的星期天时,那不是普遍都会是20191028年吗?有更好的方法吗?20191027和20191028之间只有一天的差异,它仍然会在时区下进行检查,进行计算,最终得到相同的结果。我建议实现一种手动方法,而不是依赖内置函数。我想我不明白的主要问题是,当我在4周前说星期天时,那不是普遍的情况是20191028吗?有更好的方法吗?20191027和20191028之间只有一天的差异,它仍然会在时区下进行检查,进行计算,最终得到相同的结果。我建议实现一种手动方法,而不是依赖于内置函数。在这里检查strotime 1572217200:就其本质而言,它将以某种方式依赖于时区。strotime返回的时间戳精确到秒,但您基本上只需要一天。UNIX时间戳不能只有一天。这有点冲突。你至少可以说,你想在你设定的时区里安排周日吗?那么,如果你设定奥克兰,你会得到奥克兰时间周日00:00?否则,我可能宁愿依靠手工计算,而不是依靠strotime automatic。@尼克:是的,DST!这就是为什么你从来没有用60*60*24加上一天。啊,原来的DST又来了。谈论糟糕的时机!使用Datetime对象并在此处添加一天检查strtotime 1572217200:就其本质而言,它将以某种方式依赖于时区。strotime返回的时间戳精确到秒,但您基本上只需要一天。UNIX时间戳不能只有一天。这有点冲突。你至少可以说,你想在你设定的时区里安排周日吗?那么,如果你设定奥克兰,你会得到奥克兰时间周日00:00?否则,我可能宁愿依靠手工计算,而不是依靠strotime automatic。@尼克:是的,DST!这就是为什么你从来没有用60*60*24加上一天。啊,原来的DST又来了。谈论糟糕的时机!使用Datetime对象并添加一天