PHP中判断日期是否过期的时区问题求助
解决PHP中纽约时区下日期过期判断的时区问题
你的问题根源在于:直接给DateTime传入yyyymmdd格式字符串并指定时区时,PHP会默认将该字符串视为UTC时区的日期,再转换为目标时区(America/New_York)的时间——而纽约时区冬令时比UTC晚5小时,夏令时晚4小时,这就导致UTC的2024-01-16 00:00转换为纽约时间会变成2024-01-15 19:00,看起来日期被“提前”了一天。
以下是两种可靠的解决方法,确保完全基于纽约时区判断日期是否过期:
方案一:拆分日期字符串构建纽约时区的日期
// 定义目标时区 $nyTimezone = new DateTimeZone('America/New_York'); // 拆分yyyymmdd格式字符串为年、月、日 $checkDateStr = '20240116'; $year = substr($checkDateStr, 0, 4); $month = substr($checkDateStr, 4, 2); $day = substr($checkDateStr, 6, 2); // 构建纽约时区下的目标日期(当天0点) $targetDate = new DateTime("$year-$month-$day 00:00:00", $nyTimezone); // 获取纽约时区下的当前日期(当天0点) $currentNYDate = new DateTime('today', $nyTimezone); // 比较:若目标日期早于当前纽约日期,判定为已过期 if ($targetDate < $currentNYDate) { echo 'Date has passed'; }
方案二:用指定格式及时区解析日期
$nyTimezone = new DateTimeZone('America/New_York'); // 直接按指定格式和时区解析yyyymmdd字符串,确保解析为纽约时区的当天0点 $targetDate = DateTime::createFromFormat('Ymd', '20240116', $nyTimezone); // 强制重置时间为当天0点,避免解析时的潜在时间干扰 $targetDate->setTime(0, 0, 0); // 获取纽约时区下的当前日期(当天0点) $currentNYDate = new DateTime('today', $nyTimezone); if ($targetDate < $currentNYDate) { echo 'Date has passed'; }
关键注意事项
- 避免使用
new DateTime('20240116', $nyTimezone),这种写法会先将字符串解析为UTC日期再转时区,必然导致日期偏移。 - 如果需要判断“当前纽约时间是否已超过目标日期的任何时刻”(比如目标日期是20240116,只要纽约时间到了20240117就算过期),直接比较日期部分即可,无需涉及具体时间。
内容的提问来源于stack exchange,提问作者user19103974
相关产品推荐
相关产品推荐

