date.default_latitude等四个配置仅影响date_sunrise()和date_sunset(),对date()、strtotime()、datetime等无任何作用;真正关键的是date.timezone必须设为asia/shanghai等地理时区标识符。

phpEnv 中改不了 date.default_latitude?它根本没用
直接说结论:date.default_latitude、date.default_longitude、date.sunrise_zenith、date.sunset_zenith 这四个配置项,**只被 date_sunrise() 和 date_sunset() 两个函数使用**,其他所有日期操作(date()、strtotime()、DateTime)完全无视它们。
你在 phpEnv 里费劲去配 date.default_latitude = "22.5431",对 date('Y-m-d') 输出毫无影响——不是配错了,是压根不走这条路。
- 这些配置默认值是耶路撒冷坐标(纬度
31.7667,经度35.2333),PHP 选它只是历史遗留,和中国用户无关 - 想算本地日出日落?必须显式传经纬度给
date_sunrise(),否则才 fallback 到 ini 值 - phpEnv 界面或配置文件里能改它们,但改了也只影响那两个函数,别误以为这是“全局日期配置”
真正影响 PHP 日期显示的只有 date.timezone
所有时间错乱、格式异常、本地时间变 UTC 的根源,99% 出在时区没设对。这个才是你该盯死的地方。
- 必须设成地理时区标识符,比如
Asia/Shanghai,不能写PRC、GMT+8或Etc/GMT-8(后者实际是 UTC+8,命名反直觉) - PHP 8.2+ 对空值或无效值会发警告,所以
date.timezone = ""或date.timezone = "Invalid"会报错 - 优先级:脚本中
date_default_timezone_set("Asia/Shanghai")> php.ini 中date.timezone> 系统时区 - 验证是否生效:
echo date_default_timezone_get();和echo ini_get("date.timezone");应该输出一致
date() 格式字符串写错,比时区问题更隐蔽
格式不对不会报错,只会静默输出错误结果,比如把 Y-m-d 写成 y-m-d,年份就从 2026 变成 26。
-
Y是 4 位年,y是 2 位;m是 01–12,n是 1–12;d是 01–31,j是 1–31 - 混用 24 小时制和 AM/PM:
H:i:s A永远显示 AM,因为H是 0–23,A只认g或h(1–12) - 要输出中文文字如 “年”“月”,得用反斜杠转义:
date("Y\年m\月d\日"),不然会被当格式符解析 - 第二个参数必须是 int 时间戳,传字符串如
date("Y-m-d", "2026-04-24")会返回1970-01-01
复杂时间处理,别硬刚 date() + strtotime()
一旦涉及跨时区转换、相对时间计算(如“下个月最后一天”)、或用户输入解析,strtotime() 就开始不可靠:不同 PHP 版本对 "last Monday" 解析可能不同,且不支持 locale 中文描述。
- 用
DateTime类替代:$dt = new DateTime('2026-04-24', new DateTimeZone('Asia/Shanghai')); - 时区切换直接:
$dt->setTimezone(new DateTimeZone('UTC'));,不用手动加减秒数 - 格式化统一用
$dt->format('Y-m-d H:i:s'),和date()格式符完全兼容 - 构造失败会抛
Exception,比strtotime()返回false更容易捕获错误
真正要调的只有时区和格式字符串;其他配置看着像全局开关,其实只服务两个边缘函数。别在 date.default_latitude 上浪费调试时间——它连 date() 的门都进不去。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











