准确地比较来自不同时区的日期与归零时间

时间:2018-05-02 11:40:40

标签: php datetime

我试图检查同一天是否发生了两件事情,但我遇到了一些麻烦。

使用Xero API,我得到一份工资日历列表,每个日历都有一个开始时间和一个结束时间,这些时间以Ymd的形式返回,小时/分钟/秒归零,Timezone Australia / Sydney如下:

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

我获得了一份员工最近的Timesheets列表,他们的开始和结束日期应该与工资核算日历期间相匹配 - 但他们会以时区Z(Zulu?)的形式返回,并再次使用时间归零,如此:

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

我发誓在我问到这里之前我用Google搜索了但是我还是会问:

我如何比较这两个日期?我尝试从startDate->格式创建一个新的DateTime(' Ym-d'),我尝试将时区设置为Zulu(明显超出10小时),尝试从克隆中创建一个新的DateTime祖鲁时间,我设置时区,然后得到它的Ymd部分......一些"工作"是克隆日期,设置时区,然后将时间设置为0 ... 像这样:

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

有没有更好更简洁的方法呢?

1 个答案:

答案 0 :(得分:0)

我可能误解了你的问题,但我会假设你只想确定两个日期是否相同,在调整了时区偏移后。

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