PHP日期是4周前
我有以下代码,结果输出20191027 如果我修改第二行,即将时区设置为奥克兰,则结果为20191028。为什么会这样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_
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对象并添加一天