使用 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 获取当前一周的开始/结束日期的主要内容,如果未能解决你的问题,请参考以下文章