我几个月来一直在使用以下代码,没有任何问题,以便获取当前的星期开始/结束日期(星期一/星期日):
date_default_timezone_set('Europe/Bucharest'); //this is the default in php.ini
$monday = strtotime('next Monday -1 week');
$monday = date('w', $monday)==date('w') ? $monday+7*86400 : $monday;
$sunday = strtotime(date("Y-m-d",$monday)." +6 days");
echo "Current week start/end date:<br>";
echo $this_week_sd = date("Y-m-d",$monday)."<br>";
echo $this_week_ed = date("Y-m-d",$sunday)."<br>";
//Expected result:
2018-10-29
2018-11-04
但是,从今天起,由于某种原因,这一天已被1天抵消:
//Actual incorrect result:
2018-10-28
2018-11-03
然后我想起了昨天,由于夏令时,时钟又回到了1小时,所以我决定将时区从欧洲/布加勒斯特更改为欧洲/伊斯坦布尔,与格林尼治标准时间相比还有3小时的提前时间:
date_default_timezone_set('Europe/Istanbul');
//Now the result is correct:
2018-10-29
2018-11-04
问题是,如何在当前代码中偏移DST,以便我可以使相对的星期日期保持与欧洲/布加勒斯特时区一致?任何指示或解释将不胜感激。谢谢。
答案 0 :(得分:1)
我将使用DateTime
类进行此操作,并将所有内容都保留在UTC
中,因此您不必担心夏令时:
$today = new DateTime('now', new DateTimeZone('UTC'));
$day_of_week = $today->format('w');
$today->modify('- ' . (($day_of_week - 1 + 7) % 7) . 'days');
$sunday = clone $today;
$sunday->modify('+ 6 days');
echo $today->format('Y-m-d') . "\n";
echo $sunday->format('Y-m-d');
输出:
2018-10-29
2018-11-04
答案 1 :(得分:1)
如果您只想修复当前的代码,只需替换您的三个“丑陋” ;-)行:
$monday = strtotime('next Monday -1 week');
$monday = date('w', $monday)==date('w') ? strtotime(date("Y-m-d",$monday)." +7 days") : $monday;
$sunday = strtotime(date("Y-m-d",$monday)." +6 days");
与那些“不错”的一个一起使用,它将起作用。
$monday = strtotime('monday this week');
$sunday = strtotime('sunday this week');
PHP的相对日期表达式可以很好地解决这个问题。
答案 2 :(得分:0)
我知道有多种方法可以给猫做皮毛,但在这种情况下,我对如何修复当前代码很感兴趣,更重要的是找出问题所在。
谢谢大家的建议,特别是@misorude指出了我的初始代码中的明显缺陷,而“并非每天都有86400秒”,在DST期间尤其如此。
这是使用相对的“天”而不是固定的秒数的更新后的工作代码:
$monday = strtotime('next Monday -1 week');
$monday = date('w', $monday)==date('w') ? strtotime(date("Y-m-d",$monday)." +7 days") : $monday;
$sunday = strtotime(date("Y-m-d",$monday)." +6 days");
echo "This week start/end date:<br>";
echo $this_week_sd = date("Y-m-d",$monday)."<br>";
echo $this_week_ed = date("Y-m-d",$sunday)."<br>";
//output:
This week start/end date:
2018-10-29
2018-11-04
再次感谢大家的投入。非常感谢!