Точно сравнивайте даты из разных часовых поясов с обнуленным временем - PullRequest
0 голосов
/ 02 мая 2018

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

Используя Xero API, я получаю список календарей заработной платы, каждый из которых имеет время начала и время окончания, и эти времена возвращаются в виде Ymd с обнуленными часами / минутами / секундами, с Timezone Australia / Sydney следующим образом:

DateTime Object ( [date] => 2018-05-01 00:00:00.000000 [timezone_type] => 3 [timezone] => Australia/Sydney ) 

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

DateTime Object ( [date] => 2018-04-30 00:00:00.000000 [timezone_type] => 2 [timezone] => Z ) 

Клянусь, я погуглил до того, как спросил, но все равно спрошу:

Как я могу сравнить эти две даты? Я попытался создать новый DateTime из формата startDate-> ('Ym-d'), я попытался установить часовой пояс в Zulu (был явно на 10 часов), попытался создать новый DateTime из клона времени Zulu, где я установил часовой пояс, а затем получил только часть Ymd ... Что-то, что "работает", это клонировать дату, установить часовой пояс, а затем установить время на 0 ... Как это:

$startDate = DateTime::createFromFormat('Y-m-d', $calendar->getStartDate()->format('Y-m-d'), new DateTimeZone("Australia/Sydney"))->setTime(0,0);

Есть ли лучший и аккуратный способ сделать это?

1 Ответ

0 голосов
/ 04 мая 2018

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

Используя два объекта DateTime, просто вызовите DateTime::diff. Если разница в количестве дней равна нулю, две даты совпадают (без учета времени).

// Payroll date
$p = new DateTime('2018-05-01 00:00:00.000000', new DateTimeZone('Australia/Sydney'));

// Timesheet date
$t = new DateTime('2018-04-30 00:00:00.000000', new DateTimeZone('UTC'));

var_dump($t->diff($p)->days === 0); // same
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...