PHP strtotime() 函数(建议收藏)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在 PHP 开发中,处理日期和时间是一个高频需求。无论是计算订单的到期时间、记录用户登录时间,还是生成日历功能,开发者都需要与时间数据打交道。而 PHP strtotime() 函数 正是这类场景中的核心工具。它能够将自然语言描述的日期时间(如“昨天下午三点”或“下个周五”)转换为 Unix 时间戳,极大简化了时间计算的复杂性。本文将从基础到进阶,结合实际案例,系统讲解 strtotime() 的用法、原理及常见问题,帮助开发者高效掌握这一功能。


基础用法:从自然语言到时间戳

什么是时间戳?

时间戳(Unix Timestamp)是自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。例如,当前时间戳可以通过 time() 函数获取。strtotime() 的核心功能,就是将人类可读的日期时间字符串转换为这样的数值。

示例 1:基础转换

// 将“2023-10-01”转换为时间戳  
$timestamp = strtotime("2023-10-01");  
echo $timestamp; // 输出:1696118400  

// 将“now”转换为当前时间戳  
$current_time = strtotime("now");  
echo $current_time; // 输出:当前时间戳  

支持的自然语言格式

strtotime() 支持多种自然语言表达式,例如:

  • 相对时间"yesterday""+1 day""next week"
  • 固定日期"2023-10-01""1st January 2023"
  • 模糊描述"last monday""tomorrow 5pm"

示例 2:相对时间计算

// 计算“昨天的此时”  
$yesterday = strtotime("-1 day");  
echo date("Y-m-d", $yesterday); // 输出:当前日期减一天  

// 计算“下个周五的下午 3 点”  
$next_friday = strtotime("next Friday 3pm");  
echo date("Y-m-d H:i:s", $next_friday); // 根据当前时间动态输出  

进阶技巧:灵活的时间操作

1. 结合 date() 函数格式化输出

单独使用 strtotime() 只能得到时间戳,若需可读的日期格式,需与 date() 配合。

示例 3:格式化日期

// 将“2023-10-01”格式化为“2023年10月1日”  
$date_str = "2023-10-01";  
$formatted_date = date("Y年m月d日", strtotime($date_str));  
echo $formatted_date; // 输出:2023年10月01日  

2. 处理模糊日期的“智能解析”

当输入字符串包含不完整信息时,strtotime() 会根据上下文自动补全。例如:

  • "10/5" 可能被解析为“10月5日”,但具体年份需结合当前时间。
  • "last week" 会基于当前日期计算最近的过去一周的结束时间。

示例 4:模糊日期的解析

// 当前日期为 2023-10-05  
$last_week = strtotime("last week");  
echo date("Y-m-d", $last_week); // 可能输出:2023-09-29(根据具体逻辑)  

3. 时区与偏移量的处理

默认情况下,strtotime() 使用服务器的时区设置。若需指定时区,可通过 date_default_timezone_set() 或在字符串中直接添加时区标识。

示例 5:时区设置

// 设置时区为北京时间  
date_default_timezone_set("Asia/Shanghai");  
$beijing_time = strtotime("now");  

// 直接在字符串中指定时区(PHP 5.2.0+)  
$utc_time = strtotime("now UTC");  

常见问题与解决方案

问题 1:模糊日期的歧义性

输入如 "next week" 的结果可能因当前日期而变化。例如,若今天是周一,"next week" 可能指向下周一,但若今天是周日,可能指向下周的周日。

解决方案
明确指定日期格式,例如 "next Monday""next Friday"

问题 2:跨年或跨月的边界情况

处理类似 "last month" 时,若当前是 2023-01-01,"last month" 会返回 2022-12-01,而非 2023-01-01 的前一个月。

解决方案
使用 "first day of last month" 等更精确的描述。

问题 3:非标准格式的解析失败

输入如 "2023/10/32" 会因无效日期(10月只有31天)返回 false

解决方案
先验证输入的合法性,或使用 DateTime 类的 createFromFormat() 方法。


实战案例:复杂时间场景的实现

案例 1:计算用户注册后的“30 天试用期结束时间”

// 获取当前时间  
$now = strtotime("now");  

// 计算 30 天后的结束时间  
$end_time = strtotime("+30 days", $now);  

// 格式化输出  
echo "试用期结束时间:" . date("Y-m-d H:i:s", $end_time);  

案例 2:处理用户输入的“上个月最后一周的周五”

// 获取当前日期  
$current_date = strtotime("now");  

// 计算上个月最后一周的周五  
$last_week_friday = strtotime("last Friday of last month", $current_date);  

echo date("Y-m-d", $last_week_friday); // 输出结果依赖当前日期  

DateTime 类的对比

PHP 还提供了 DateTime 类作为更现代的替代方案。虽然 strtotime() 更简洁,但 DateTime 提供了更灵活的面向对象接口,尤其适合复杂场景。

示例 6:使用 DateTime 实现相同功能

// 用 DateTime 替代 strtotime  
$dt = new DateTime("next Friday");  
echo $dt->format("Y-m-d"); // 输出与 strtotime 类似的结果  

总结

PHP strtotime() 函数 是处理日期和时间的利器,其核心优势在于将自然语言无缝转换为时间戳,简化了开发流程。通过掌握其基础语法、进阶技巧及常见问题的解决方案,开发者可以高效应对从简单的时间计算到复杂的业务逻辑场景。建议在开发中结合 date() 函数和 DateTime 类,根据需求灵活选择工具,同时注意时区设置和输入验证,以避免潜在的逻辑错误。

掌握 PHP strtotime() 函数后,时间不再是开发中的难题,而是可以被轻松操控的“数字语言”。

最新发布