php - 准确比较来自不同时区的日期与归零时间
问题描述
我正在尝试检查两件事是否在同一日期发生,但遇到了一些麻烦。
使用 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);
有没有更好更整洁的方法来做到这一点?
解决方案
我可能误解了您的问题,但我假设您只是想确定两个日期是否相同,在它们已针对时区偏移进行调整后。
使用这两个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
推荐阅读
- arrays - Google GeoChart(Lavacharts 库)-> AddRow / AddRows 未在地图上呈现任何结果,尽管创建了值数组
- git - 执行 git apply 时出现错误“删除 1 个前导路径名组件时 git diff 标头缺少文件名信息”
- azure-active-directory - OIDC 应用程序日志记录
- html - 我可以在媒体查询中包含和排除 html 文本吗?
- javascript - 如何限制“FileUploadBox()”按钮的数量?
- c# - 只使用一份请愿书而不是多份
- node.js - 使用猫鼬将上传的图像名称保存在数组中
- javascript - 如何根据用户输入计算多个地点的旅程燃油价格
- sql-server - 触发器存在但未显示在服务器对象、数据库触发器或表下的触发器文件夹中
- jhipster - 由于 CloudFoundry 激活了云配置文件,jHipster App 正常崩溃