You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP日期处理异常:无法正确获取年中的天数问题排查

问题原因与解决方案

核心问题:函数参数类型不匹配

你遇到的所有问题,本质都是混淆了PHP中DateTime对象、格式化日期字符串、Unix时间戳这三种类型的适用场景:

  • date() 和 getDate() 函数的第二个参数要求传入Unix时间戳(整数类型,代表从1970-01-01 00:00:00 UTC到指定时间的秒数),而非DateTime对象或格式化后的日期字符串。
  • 当传入非时间戳类型的值时,PHP会自动转换为整数:传入DateTime对象或无效日期字符串时,都会被当作0处理,对应Unix时间戳0的基准日期(1970-01-01),因此出现返回空、0或1970年数据的问题。

正确解决方法

方法1:直接使用DateTime对象的format()方法(推荐)

DateTime类自带format()方法,可直接输出指定格式的内容,无需类型转换:

// 获取年中的天数(z格式符:0-365,对应2023-09-04输出246)
echo $t1->format('z');

方法2:将DateTime对象转为时间戳后使用date()

用getTimestamp()方法把DateTime对象转为Unix时间戳,再传给date():

$timestamp = $t1->getTimestamp();
echo date('z', $timestamp);

方法3:用date_format()直接格式化DateTime对象

date_format()的第一个参数支持接收DateTime对象,第二个参数指定格式:

echo date_format($t1, 'z');

纠正错误写法

  • 错误写法:echo('z',$datetime_1) → 这是语法错误,需先将格式化字符串转为DateTime对象,再转时间戳使用date():
    $dt = DateTime::createFromFormat('m-d-Y H:i', $datetime_1);
    echo date('z', $dt->getTimestamp());
    
  • 错误写法:getDate($datetime_1) → 需传入时间戳,或先将字符串转为DateTime对象再处理:
    $dt = DateTime::createFromFormat('m-d-Y H:i', $datetime_1);
    $dateArray = getDate($dt->getTimestamp());
    print_r($dateArray);
    

内容的提问来源于stack exchange,提问作者Jacco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:55:31