Получить дату начала / окончания текущей недели с DST - PullRequest
0 голосов
/ 29 октября 2018

Я использовал следующий код в течение нескольких месяцев без каких-либо проблем, чтобы получить дату начала / окончания текущей недели (понедельник / воскресенье):

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 голосов
/ 29 октября 2018

Если вы просто хотите исправить свой текущий код, просто замените три «уродливые» ;-) строки:

$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 могут справиться с этим.

0 голосов
/ 29 октября 2018

Я знаю, что существует несколько способов обшарить кошку, но в этом случае меня интересовало, как исправить мой текущий код и, что более важно, выяснить, что с ним не так.

Спасибо всем за ваши предложения, особенно @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

Еще раз, спасибо всем за ваш вклад. Очень ценится!

0 голосов
/ 29 октября 2018

Я бы сделал это, используя класс 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

Демонстрация на 3v4l.org

...