0

0

php中strtotime函数怎么用 php中strtotime函数用法详解

穿越時空

穿越時空

发布时间:2025-08-29 14:06:02

|

291人浏览过

|

来源于php中文网

原创

strtotime函数用于将人类可读的日期字符串转换为Unix时间戳,支持多种格式(如"2023-10-26"、"+1 day"、"next Monday")和相对时间计算,常用于快速日期处理;其核心语法为strtotime($datetime, $baseTimestamp = null),返回时间戳或false;使用时需检查返回值以避免解析失败导致的错误;对于复杂场景或严格格式验证,推荐使用DateTime类以获得更强的控制和错误处理能力。

php中strtotime函数怎么用 php中strtotime函数用法详解

PHP中的

strtotime
函数,简单来说,就是把一个人类能读懂的日期时间字符串,转化成一个Unix时间戳。这东西在日常开发里简直是利器,尤其当你需要对日期做一些加减运算或者格式转换时,它能省去你不少麻烦。

解决方案

strtotime
函数的基本用法其实非常直观:你给它一个字符串,它就尝试解析并返回一个时间戳。它的强大之处在于,这个字符串可以是五花八门的形式,无论是绝对时间还是相对时间,它都能处理得相当好。

核心语法:

int|false strtotime(string $datetime, int $baseTimestamp = null)
  • $datetime
    : 这是你想要解析的日期时间字符串。它可以是像 "2023-10-26 14:30:00" 这样的精确日期,也可以是 "now", "+1 day", "next Monday", "last day of February" 这种相对表达。
  • $baseTimestamp
    (可选): 如果你提供了这个参数,那么所有相对日期(比如 "+1 day")都会以这个时间戳为基准进行计算,而不是当前的系统时间。这在处理特定上下文的日期计算时非常有用。

实际操作中,我通常会这样用:

立即学习PHP免费学习笔记(深入)”;

// 获取当前时间戳
$now = strtotime("now");
echo "当前时间戳: " . $now . "\n"; // 输出类似:当前时间戳: 1678886400

// 明天同一时间的时间戳
$tomorrow = strtotime("+1 day");
echo "明天的时间戳: " . $tomorrow . "\n";

// 下周一的时间戳
$nextMonday = strtotime("next Monday");
echo "下周一的时间戳: " . $nextMonday . "\n";

// 特定日期的时间戳
$specificDate = strtotime("2023-01-15 10:00:00");
echo "2023年1月15日10点的时间戳: " . $specificDate . "\n";

// 基于某个时间点计算
$somePastDate = strtotime("2022-06-01");
$oneMonthLaterFromPastDate = strtotime("+1 month", $somePastDate);
echo "2022年6月1日后一个月的时间戳: " . $oneMonthLaterFromPastDate . "\n";
echo "对应的日期: " . date("Y-m-d H:i:s", $oneMonthLaterFromPastDate) . "\n";

记住,

strtotime
在成功时返回Unix时间戳(一个整数),失败时返回
false
。所以,在使用它的结果之前,务必进行严格的类型检查,比如
if ($timestamp === false)
。这能帮你避免很多潜在的bug,毕竟用户输入或者外部数据源的日期格式,往往比你想象的要“野”。

strtotime
函数到底能识别哪些日期时间格式?

这个问题其实是很多开发者初次接触

strtotime
时都会好奇的。我的经验是,它远比你想象的要“智能”和“宽容”。它能识别的格式非常多,从严格的ISO 8601格式到非常口语化的表达,它都有不错的解析能力。

常见的支持格式类型:

  1. 绝对日期时间:

    • YYYY-MM-DD HH:MM:SS
      (e.g., "2023-10-26 14:30:00")
    • YYYY/MM/DD HH:MM:SS
      (e.g., "2023/10/26 14:30:00")
    • MM/DD/YYYY
      (e.g., "10/26/2023")
    • DD-MM-YYYY
      (e.g., "26-10-2023")
    • YYYYMMDD
      (e.g., "20231026")
    • 带有文本月份的格式 (e.g., "October 26, 2023", "26 Oct 2023", "26-Oct-2023")
    • 带有时间区的信息 (e.g., "2023-10-26T14:30:00+08:00")
  2. 相对日期时间:

    • 相对当前时间: "now", "today", "yesterday", "tomorrow"
    • 相对增量: "+1 day", "-2 weeks", "+3 months", "+5 years"
    • 特定星期几: "next Monday", "last Friday", "this Sunday"
    • 月份中的特定位置: "first day of next month", "last day of this month", "second Tuesday of January"
    • 混合表达: "next Monday 10:00 AM", "last day of February 2024"

一些我个人观察到的细节:

Insou AI
Insou AI

Insou AI 是一款强大的人工智能助手,旨在帮助你轻松创建引人入胜的内容和令人印象深刻的演示。

下载
  • 英文单词的识别度很高: "January", "Feb", "Mar", "Mon", "Tue" 等缩写和全称都能被很好地理解。
  • 分隔符的灵活性: 日期部分用
    -
    ,
    /
    ,
    .
    甚至空格分隔,时间部分用
    :
    分隔,通常都能被正确解析。
  • 模糊性问题: 偶尔会遇到像 "01/02/03" 这样的日期,它到底是 "月/日/年" 还是 "日/月/年"?
    strtotime
    会尝试根据上下文和PHP的默认时区设置来推断,但这种情况下最好还是使用更明确的格式,或者配合
    DateTime::createFromFormat
    来严格解析。
  • 性能考量: 尽管它很强大,但对于非常大量的日期解析,或者你需要非常精确且严格的格式控制时,我会倾向于使用
    DateTime
    类,因为它提供了更细粒度的控制和更好的错误处理机制。

总的来说,

strtotime
在处理日常、非严格的用户输入或者内部已知格式的日期时,表现非常出色。但当面对复杂、多变或潜在有歧义的日期字符串时,保持警惕并考虑更健壮的方案是明智的。

如何处理
strtotime
返回
false
的情况,以确保代码的健壮性?

strtotime
返回
false
,这绝对不是什么罕见的事情。它通常意味着你传入的字符串无法被它识别为有效的日期时间格式。忽略这种情况,你的程序就可能因为一个
false
值被当作0(Unix时间戳的开始)而产生意想不到的错误,比如计算出错误的日期,或者在需要日期字符串的地方输出一个空值甚至PHP警告。

我的处理原则是:永远检查

strtotime
的返回值。

$user_input_date_string = "2023年10月26日"; // 假设这是用户输入,strtotime可能无法直接解析
$timestamp = strtotime($user_input_date_string);

if ($timestamp === false) {
    // 无法解析,这里应该有你的错误处理逻辑
    echo "错误:无法解析日期字符串 '{$user_input_date_string}'。\n";
    // 常见的处理方式:
    // 1. 设置一个默认值,比如当前时间
    $timestamp = time();
    echo "已使用当前时间作为默认值。\n";
    // 2. 抛出异常,让上层代码处理
    // throw new InvalidArgumentException("Invalid date string provided.");
    // 3. 返回一个错误码或特定的错误状态
    // return ['status' => 'error', 'message' => 'Invalid date format'];
} else {
    echo "解析成功,时间戳为: " . $timestamp . "\n";
    echo "对应的日期是: " . date("Y-m-d H:i:s", $timestamp) . "\n";
}

// 另一个例子:一个完全无效的字符串
$invalid_string = "这不是一个日期";
$timestamp_invalid = strtotime($invalid_string);
if ($timestamp_invalid === false) {
    echo "错误:'{$invalid_string}' 无法被解析。\n";
}

具体的处理策略:

  1. 友好的错误提示: 如果是用户输入导致的,应该给用户一个明确的提示,告诉他们日期格式不正确,并引导他们输入正确的格式。
  2. 默认值或回退机制: 在某些非关键场景,你可能不希望程序直接崩溃。可以设置一个默认值,比如当前时间、某个固定的起始日期,或者最近的有效日期。
  3. 日志记录: 将无法解析的日期字符串记录下来,这对于后续分析和改进程序的兼容性非常有帮助。
  4. 使用更强大的解析工具 对于那些你预料到会有多种格式,或者需要严格验证的日期输入,
    DateTime::createFromFormat()
    是更好的选择。它允许你指定一个或多个精确的格式,如果输入不符合,它会返回
    false
    ,并且你可以通过
    DateTime::getLastErrors()
    获取详细的错误信息。
// 使用 DateTime::createFromFormat 来更严格地解析
$dateString = "26-10-2023";
$format = "d-m-Y";
$dateTimeObject = DateTime::createFromFormat($format, $dateString);

if ($dateTimeObject === false) {
    echo "错误:日期字符串 '{$dateString}' 不符合格式 '{$format}'。\n";
    $errors = DateTime::getLastErrors();
    print_r($errors); // 查看详细错误信息
} else {
    echo "DateTime对象创建成功: " . $dateTimeObject->format("Y-m-d H:i:s") . "\n";
}

通过这种方式,你的代码会变得更加健壮,能够优雅地处理各种预期和非预期的日期输入。

strtotime
DateTime
类相比,何时选择哪个方案更合适?

这是一个非常经典的PHP日期处理选择题,我自己在项目里也经常根据具体场景来权衡。简单来说,

strtotime
就像一把瑞士军刀,轻巧、方便,能解决大部分快速转换和简单计算的需求;而
DateTime
类则更像一个专业的工具箱,功能强大、面向对象,适用于复杂的日期操作和严格的格式控制。

选择

strtotime
的场景:

  • 快速转换: 当你只需要将一个已知格式的日期字符串(特别是相对日期字符串)快速转换为Unix时间戳时,
    strtotime
    是首选。比如获取“明天”或“下个月的第一天”的时间戳。
  • 简单计算: 对日期进行简单的加减运算,如
    strtotime('+1 day', $someTimestamp)
  • 原型开发/小脚本: 在一些不需要严格错误处理,或者格式相对固定的场景下,
    strtotime
    的简洁性可以提高开发效率。
  • 处理可信赖的、内部生成的日期字符串: 如果你确定日期字符串的来源是可靠的,格式不会有太大问题,
    strtotime
    完全够用。

示例:

// 获取一个时间戳,然后格式化输出
$twoWeeksLater = strtotime('+2 weeks');
echo date('Y-m-d', $twoWeeksLater) . "\n"; // 快速获取两周后的日期

选择

DateTime
类的场景:

  • 严格的格式验证和解析: 当你需要从用户输入中解析日期,并且要求日期必须符合特定的格式时,
    DateTime::createFromFormat()
    是你的不二之选。它能精确控制解析过程,并提供详细的错误信息。
  • 复杂的日期操作: 需要进行日期比较、时间间隔计算(
    diff()
    )、时区转换、日期增减(
    modify()
    ,
    add()
    ,
    sub()
    )等复杂操作时,
    DateTime
    类提供了丰富的API,让代码更清晰、更易维护。
  • 面向对象编程风格: 如果你的项目倾向于使用面向对象的方式处理数据,
    DateTime
    对象自然地融入了这种风格。
  • 不可变性需求:
    DateTimeImmutable
    类提供了不可变日期对象,每次修改都会返回一个新的实例,这在并发环境或需要保持原始日期不变的场景下非常有用。
  • 更好的错误处理:
    DateTime
    类在解析失败时,可以获取详细的错误信息,有助于调试和用户反馈。

示例:

// 从用户输入中解析日期,并严格验证格式
$userInput = "2023/10/26";
$format = "Y-m-d"; // 期望的格式是 YYYY-MM-DD
$dateObj = DateTime::createFromFormat($format, $userInput);

if ($dateObj === false) {
    echo "日期格式不正确,请使用 YYYY-MM-DD 格式。\n";
    // 处理错误
} else {
    // 进行复杂的日期操作,比如计算3个月后的日期
    $dateObj->add(new DateInterval('P3M'));
    echo "3个月后的日期是: " . $dateObj->format('Y-m-d') . "\n";
}

总结一下我的个人看法: 对于大部分“一次性”的日期时间转换或者简单的相对日期计算,

strtotime
因其简洁和高效而非常实用。但一旦涉及用户输入、严格的格式要求、复杂的日期逻辑或者需要长期维护的代码,我几乎总是会转向
DateTime
类。它虽然看起来代码量会多一些,但带来的可维护性、健壮性和功能丰富度是
strtotime
无法比拟的。选择哪个,更多是看你当前的任务对“精确度”和“控制力”的需求有多高。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1110

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

58

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

64

2025.11.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.5万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号