0

0

PHP如何获取当前日期和时间_PHP获取当前日期时间的函数与格式化

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-09-15 19:39:01

|

1024人浏览过

|

来源于php中文网

原创

最直接的方法是使用date()函数获取当前日期时间,推荐使用DateTime类进行更复杂的操作。date()函数通过格式化字符如Y-m-d H:i:s输出可读时间,默认基于当前Unix时间戳;DateTime类则支持面向对象的链式调用、时区设置(DateTimeZone)、时间加减(modify/add/sub)及DateInterval精确间隔运算。为避免时区错误,应全局设置date_default_timezone_set('UTC')或指定时区,并在存储时用UTC时间戳,显示时转换为目标时区。常见格式化字符包括Y(四位年)、m(两位月)、d(两位日)、H(24小时)、i(分钟)、s(秒)等,可组合生成自定义格式。strtotime()可用于简单相对时间计算,但复杂逻辑建议用DateTime配合DateInterval以提升代码清晰度与准确性。

php如何获取当前日期和时间_php获取当前日期时间的函数与格式化

在PHP中获取当前日期和时间,最直接也是最常用的方法就是利用内置的

date()
函数,它能根据你提供的格式字符串,将当前的Unix时间戳(或者你指定的其他时间戳)转换成可读性强的日期时间格式。当然,对于更复杂的日期时间操作和面向对象的编程风格,
DateTime
类则是更现代、功能更强大的选择。

解决方案

PHP提供了一系列函数和类来处理日期和时间,其中最核心的莫过于

date()
函数和
DateTime
类。

1. 使用

date()
函数

date()
函数是PHP中获取和格式化日期时间的基础。它接受两个参数:一个必选的格式字符串,以及一个可选的Unix时间戳。如果不提供时间戳,它默认使用当前时间。

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

<?php
// 获取当前日期和时间,以常见的 "年-月-日 时:分:秒" 格式
echo "当前时间 (date() 默认): " . date('Y-m-d H:i:s') . "\n";

// 获取当前的Unix时间戳
$currentTimestamp = time();
echo "当前Unix时间戳: " . $currentTimestamp . "\n";

// 使用指定时间戳格式化日期时间
// 比如,获取一天前的日期
$yesterdayTimestamp = strtotime('-1 day');
echo "一天前的日期 (date() 指定时间戳): " . date('Y-m-d H:i:s', $yesterdayTimestamp) . "\n";

// 获取当前年份
echo "当前年份: " . date('Y') . "\n";
// 获取当前月份(数字)
echo "当前月份: " . date('m') . "\n";
// 获取当前星期几(数字,0代表周日)
echo "当前星期几: " . date('w') . "\n";
?>

date()
函数非常灵活,通过不同的格式化字符组合,几乎可以满足所有日常的日期时间显示需求。

2. 使用

DateTime
类 (推荐)

DateTime
类是PHP 5.2.0及更高版本引入的,它提供了一个面向对象的日期时间处理方式,功能更强大,也更易于维护和扩展。在我看来,一旦你习惯了它的用法,你会发现它在处理复杂日期时间逻辑时,比
date()
函数和
strtotime()
的组合要清晰得多。

<?php
// 创建一个表示当前时间的DateTime对象
$now = new DateTime();
echo "当前时间 (DateTime 对象): " . $now->format('Y-m-d H:i:s') . "\n";

// 创建一个表示特定时间的DateTime对象
$specificDate = new DateTime('2023-01-15 10:30:00');
echo "指定时间 (DateTime 对象): " . $specificDate->format('Y-m-d H:i:s') . "\n";

// DateTime对象同样可以获取Unix时间戳
echo "DateTime对象的Unix时间戳: " . $now->getTimestamp() . "\n";

// 链式操作示例:获取当前时间,然后加上10天,再格式化
$futureDate = (new DateTime())->modify('+10 days');
echo "未来10天的日期 (DateTime 链式操作): " . $futureDate->format('Y-m-d H:i:s') . "\n";
?>

DateTime
类不仅能获取当前时间,还能方便地进行日期时间的加减、比较、时区转换等操作,是现代PHP开发中处理日期时间的标准做法。

PHP日期时间函数中常用的格式化字符有哪些,如何灵活运用?

说起PHP的日期时间格式化,

date()
函数和
DateTime::format()
方法都依赖一套非常精妙的格式化字符。理解并掌握这些字符,是玩转PHP日期时间显示的关键。我个人觉得,这就像是给时间穿上不同款式的衣服,你想要什么风格,就用对应的字符去搭配。

下面是一些我经常用到,也认为非常实用的格式化字符:

  • 年份:
    • Y
      : 四位数字表示的年份(例如:2023)
    • Y
      : 两位数字表示的年份(例如:23)
  • 月份:
    • m
      : 两位数字表示的月份(01到12)
    • n
      : 一位或两位数字表示的月份(1到12,无前导零)
    • m
      : 缩写的月份名称(例如:Jan, Feb)
    • F
      : 完整的月份名称(例如:January, February)
  • 日期:
    • d
      : 两位数字表示的日期(01到31)
    • j
      : 一位或两位数字表示的日期(1到31,无前导零)
  • 星期:
    • d
      : 缩写的星期几名称(例如:Mon, Tue)
    • l
      (小写L): 完整的星期几名称(例如:Monday, Tuesday)
    • w
      : 数字表示的星期几(0表示周日,6表示周六)
  • 小时:
    • H
      : 24小时制,两位数字表示(00到23)
    • H
      : 12小时制,两位数字表示(01到12)
    • G
      : 24小时制,无前导零(0到23)
    • G
      : 12小时制,无前导零(1到12)
  • 分钟:
    • i
      : 两位数字表示的分钟(00到59)
  • 秒数:
    • s
      : 两位数字表示的秒数(00到59)
  • 上午/下午:
    • a
      : 小写am/pm
    • a
      : 大写AM/PM
  • 时区:
    • T
      : 时区缩写(例如:EST, PST)
    • Z
      : 时区偏移量(秒),西边是负数,东边是正数
  • Unix时间戳:
    • U
      : Unix时间戳

灵活运用示例:

<?php
$now = new DateTime();

// 中国人习惯的年月日时分秒
echo "格式一 (中文常用): " . $now->format('Y年m月d日 H:i:s') . "\n";

// 英文日志风格,带星期和AM/PM
echo "格式二 (英文日志): " . $now->format('D, M j, Y h:i:s A') . "\n";

// 数据库存储的紧凑格式,不带分隔符
echo "格式三 (数据库紧凑): " . $now->format('YmdHis') . "\n";

// 只显示日期,不带年份
echo "格式四 (月日): " . $now->format('m-d') . "\n";

// 结合时区信息
echo "格式五 (带时区): " . $now->format('Y-m-d H:i:s T (P)') . "\n"; // P是ISO 8601格式的时区偏移量
?>

通过这些例子,你会发现,这些格式化字符可以像积木一样随意组合,中间甚至可以插入任意的文本字符(比如“年”、“月”、“日”),来生成你想要的任何日期时间显示效果。这给了开发者极大的自由度。

PHP处理时区(Timezone)的最佳实践是什么,如何避免时间显示错误?

时区问题,说实话,是日期时间处理中最容易踩坑,也最容易被忽视的一环。我见过太多因为服务器时区、PHP配置时区和用户期望时区不一致,导致系统显示时间混乱的案例。要避免这些头疼的问题,最佳实践就是明确地设置和管理时区

1. 全局设置默认时区

最基本的一步,也是我个人认为必须要做的一步,就是在你的PHP应用程序入口(比如

index.php
或某个初始化文件)设置一个默认时区。这能确保所有不指定时区的
date()
函数调用和
DateTime
对象创建都使用这个时区。

靠岸学术
靠岸学术

一款集翻译,阅读,文献管理于一体的英文文献阅读器

下载
<?php
// 推荐在应用启动时设置
date_default_timezone_set('Asia/Shanghai'); // 设置为上海时区

// 或者你也可以根据你的服务器位置或目标用户群来设置
// date_default_timezone_set('America/New_York');
// date_default_timezone_set('UTC'); // UTC是一个非常安全的默认选择,因为它没有夏令时,且是世界标准时间

echo "当前时间 (默认时区): " . date('Y-m-d H:i:s') . "\n";
?>

选择

UTC
作为默认时区是一个非常好的习惯,尤其是在存储数据到数据库时。这样可以避免夏令时等复杂问题,确保数据存储的统一性。显示给用户时,再根据用户的时区偏好进行转换。

2.

DateTime
对象的时区管理

DateTime
类在时区管理上更加灵活和强大。你可以在创建
DateTime
对象时就指定时区,或者在之后改变它的时区。

<?php
// 假设默认时区是 'Asia/Shanghai'

// 创建一个指定时区的DateTime对象
$utcTime = new DateTime('now', new DateTimeZone('UTC'));
echo "UTC时间: " . $utcTime->format('Y-m-d H:i:s') . "\n";

// 创建一个默认时区的DateTime对象
$localTime = new DateTime();
echo "本地时间: " . $localTime->format('Y-m-d H:i:s') . "\n";

// 将UTC时间转换为本地时区显示
$utcTime->setTimezone(new DateTimeZone('Asia/Shanghai'));
echo "UTC时间转换为本地显示: " . $utcTime->format('Y-m-d H:i:s') . "\n";

// 将本地时间转换为纽约时区显示
$localTime->setTimezone(new DateTimeZone('America/New_York'));
echo "本地时间转换为纽约显示: " . $localTime->format('Y-m-d H:i:s') . "\n";
?>

避免时间显示错误的策略:

  • 数据存储统一化: 强烈建议将所有日期时间数据以UTC时间戳(
    time()
    DateTime::getTimestamp()
    )或UTC格式化字符串存储到数据库。这样可以避免因服务器时区变化或不同服务器之间时区不一致导致的数据混乱。
  • 前端/后端协同: 如果你的应用面向全球用户,那么前端JS获取用户本地时区,然后将时间戳传递给后端,或者后端传UTC时间戳给前端,让前端自行转换显示,是一个非常常见的做法。
  • 明确的时区声明: 永远不要假设服务器的时区就是你想要的时区。使用
    date_default_timezone_set()
    DateTimeZone
    明确指定。
  • 测试: 在不同时区环境下测试你的应用,确保日期时间显示正确。特别是跨越夏令时切换点时,更容易暴露问题。

在我看来,处理时区就像是国际贸易,大家得用一个通用的标准(比如UTC)来交换货物,然后在各自的市场(本地时区)上进行定价和销售。这样才能避免混乱,确保交易的准确性。

PHP中如何进行日期时间的加减运算,实现未来或过去时间的计算?

除了获取当前时间,我们经常需要计算某个日期之前或之后的日期,比如“订单创建时间7天后自动关闭”、“用户上次登录30分钟前”等等。PHP提供了几种方式来处理日期时间的加减运算,从简单的字符串解析到功能强大的面向对象操作,都能满足你的需求。

1.

strtotime()
函数进行简单加减

strtotime()
函数是一个非常强大的日期时间字符串解析器。它能将各种英文文本日期时间描述转换成Unix时间戳,并且支持相对格式,这使得它在进行简单的日期时间加减时异常方便。

<?php
date_default_timezone_set('Asia/Shanghai');

$now = time(); // 当前Unix时间戳

// 计算一天后的时间
$tomorrow = strtotime('+1 day', $now);
echo "一天后的时间: " . date('Y-m-d H:i:s', $tomorrow) . "\n";

// 计算3小时前的时间
$threeHoursAgo = strtotime('-3 hours', $now);
echo "三小时前的时间: " . date('Y-m-d H:i:s', $threeHoursAgo) . "\n";

// 计算下周一的时间
$nextMonday = strtotime('next monday', $now);
echo "下周一的时间: " . date('Y-m-d H:i:s', $nextMonday) . "\n";

// 计算上个月的今天
$lastMonthToday = strtotime('last month', $now);
echo "上个月的今天: " . date('Y-m-d H:i:s', $lastMonthToday) . "\n";

// 计算特定日期后的15天
$specificDate = strtotime('2023-01-15');
$fifteenDaysLater = strtotime('+15 days', $specificDate);
echo "2023-01-15后的15天: " . date('Y-m-d H:i:s', $fifteenDaysLater) . "\n";
?>

strtotime()
的强大之处在于其自然语言的描述能力,对于快速、简单的日期时间操作非常高效。但需要注意的是,它的行为有时可能会因为日期的边界问题(比如月底)而略显“魔幻”,所以对于严谨的业务逻辑,我更倾向于
DateTime
对象。

2.

DateTime
对象的
modify()
方法

DateTime
对象提供了
modify()
方法,它与
strtotime()
使用相同的相对格式字符串,但操作的是
DateTime
对象本身,这让链式操作和面向对象的编程风格更加流畅。

<?php
date_default_timezone_set('Asia/Shanghai');

$now = new DateTime(); // 创建当前时间的DateTime对象

// 计算2天后的时间
$twoDaysLater = (new DateTime())->modify('+2 days');
echo "两天后的时间 (modify): " . $twoDaysLater->format('Y-m-d H:i:s') . "\n";

// 从当前时间减去5小时30分钟
$pastTime = (new DateTime())->modify('-5 hours -30 minutes');
echo "5小时30分钟前 (modify): " . $pastTime->format('Y-m-d H:i:s') . "\n";

// 计算下个月的第一个工作日
$nextMonthFirstWeekday = (new DateTime('first day of next month'))->modify('next weekday');
echo "下个月的第一个工作日 (modify): " . $nextMonthFirstWeekday->format('Y-m-d H:i:s') . "\n";
?>

3.

DateTime
对象的
add()
sub()
方法结合
DateInterval

对于更精确、更明确的日期时间加减,尤其是当加减的单位和数量比较复杂时,

DateTime
对象的
add()
sub()
方法结合
DateInterval
类是我的首选。这种方式代码可读性更高,也更不容易出错。

DateInterval
对象代表一个时间间隔,你可以指定年、月、日、时、分、秒等。

<?php
date_default_timezone_set('Asia/Shanghai');

$now = new DateTime();

// 添加一个间隔:2年1个月3天
$intervalAdd = new DateInterval('P2Y1M3D'); // P表示Period,2Y表示2年,1M表示1月,3D表示3天
$futureDateWithInterval = clone $now; // 克隆当前时间,避免修改原始对象
$futureDateWithInterval->add($intervalAdd);
echo "当前时间 + 2年1月3天: " . $futureDateWithInterval->format('Y-m-d H:i:s') . "\n";

// 减去一个间隔:10小时25分钟
$intervalSub = new DateInterval('PT10H25M'); // P表示Period,T表示Time,10H表示10小时,25M表示25分钟
$pastDateWithInterval = clone $now;
$pastDateWithInterval->sub($intervalSub);
echo "当前时间 - 10小时25分钟: " . $pastDateWithInterval->format('Y-m-d H:i:s') . "\n";

// 也可以直接在DateInterval构造函数中传入字符串,就像modify一样
$intervalFromStr = DateInterval::createFromDateString('5 days and 6 hours');
$anotherFutureDate = clone $now;
$anotherFutureDate->add($intervalFromStr);
echo "当前时间 + 5天6小时: " . $anotherFutureDate->format('Y-m-d H:i:s') . "\n";
?>

在我看来,

DateInterval
就像一个精确的计量工具,它让你能够非常清晰地定义你想要加减的时间量,避免了
strtotime()
modify()
在某些复杂场景下可能出现的歧义。对于需要高度精确和可维护性的日期时间运算,我总是倾向于使用
DateInterval

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
go语言 面向对象
go语言 面向对象

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

58

2025.09.05

java面向对象
java面向对象

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

63

2025.11.27

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

888

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

463

2024.06.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中文网学习。

1568

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

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

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

26

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号