使用DST获取当前的星期开始/结束日期

时间:2018-10-29 08:07:25

标签: php timezone dst timezone-offset

我几个月来一直在使用以下代码,没有任何问题,以便获取当前的星期开始/结束日期(星期一/星期日):

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,以便我可以使相对的星期日期保持与欧洲/布加勒斯特时区一致?任何指示或解释将不胜感激。谢谢。

3 个答案:

答案 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

Demo on 3v4l.org

答案 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

再次感谢大家的投入。非常感谢!