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

Posted

技术标签:

【中文标题】使用 DST 获取当前一周的开始/结束日期【英文标题】:Get current week start/end date with DST 【发布时间】:2019-04-02 03:08:02 【问题描述】:

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

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

然后我记得昨天由于 DST,时钟回退了 1 小时,所以我决定将时区从欧洲/布加勒斯特更改为欧洲/伊斯坦布尔,它仍然比格林威治标准时间提前 +3 小时:

date_default_timezone_set('Europe/Istanbul');

//Now the result is correct: 
2018-10-29
2018-11-04

问题是,如何在当前代码中抵消 DST,以便根据欧洲/布加勒斯特时区保持相对星期日期?任何指示或解释将不胜感激。谢谢。

【问题讨论】:

不是每一天都有 86400 秒,所以“幻数”一开始就不应该出现在你的代码中。你为什么要这样做?在之前的那一行中,您似乎仍然知道如何将给定的时间戳按一周来操作... 哇,我不敢相信我错过了。你是绝对正确的。现在切换到相对日期。 【参考方案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 的相关日期表达式可以很好地处理这个问题。

【讨论】:

您的解决方案在某些情况下可能不起作用,这取决于所使用的 php 版本。我正在使用的解决方案虽然对您来说可能看起来“丑陋”,但它已经在各种情况下进行了尝试和测试。有关更多信息,请阅读此处(这导致我首先使用我正在使用的“丑陋”代码):***.com/questions/13798026/… 好的,谢谢您的信息。它一直有效到 DST ;) 仅供参考:我在这里尝试过,回到 5.2 它有效。 3v4l.org/ZvmZ8#output【参考方案2】:

我会使用 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

【讨论】:

【参考方案3】:

我知道给猫剥皮的方法不止一种,但在这种情况下,我感兴趣的是如何修复我当前的代码,更重要的是找出它的问题所在。

感谢大家的建议,尤其感谢@misorude 指出我初始代码中的明显缺陷,而“并非每天都有 86400 秒”,在夏令时期间尤其如此。

所以这是使用相对“天”而不是固定秒数的更新工作代码:

$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

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

【讨论】:

以上是关于使用 DST 获取当前一周的开始/结束日期的主要内容,如果未能解决你的问题,请参考以下文章

获取某一天所在周的开始日期和结束日期

php 获取当前周的开始结束日期

如果根据当前日期获取当前周日期和当前周日期

获取给定周年、给定月份和给定周的开始和结束日期

python代码根据当前时间获取下一周的日期

如何获取当月第一周的日期