首页 > 解决方案 > 准确比较来自不同时区的日期与归零时间

问题描述

我正在尝试检查两件事是否在同一日期发生,但遇到了一些麻烦。

使用 Xero API,我得到一个工资单日历列表,每个日历都有一个开始时间和一个结束时间,这些时间以 Ymd 形式返回,小时/分钟/秒归零,澳大利亚/悉尼时区如下:

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

我得到了一个员工最近的时间表列表,他们的开始和结束日期应该与工资日历期间相匹配 - 但他们作为时区 Z(祖鲁?)返回,并且再次将时间归零,因此:

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

我发誓我在这里问之前用谷歌搜索过,但无论如何我都会问:

如何比较这两个日期?我尝试从 startDate->format('Ymd') 创建一个新的 DateTime,我尝试将时区设置为 Zulu(显然是 10 小时),尝试从我设置时区的 Zulu 时间的克隆创建一个新的 DateTime然后只得到它的 Ymd 部分......“有效”的东西是克隆日期,设置时区,然后将时间设置为 0......就像这样:

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

有没有更好更整洁的方法来做到这一点?

标签: phpdatetime

解决方案


我可能误解了您的问题,但我假设您只是想确定两个日期是否相同,在它们已针对时区偏移进行调整后。

使用这两个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

推荐阅读