0

0

PHP中的日期处理有哪些方法

零下一度

零下一度

发布时间:2017-07-03 09:16:04

|

1689人浏览过

|

来源于php中文网

原创

本文包含以下内容:  
1、 得到目前的日期和时间-我们有多少种方式?  
2、 改变日期显示的方式-日期和时间的显示形式  
3、 转换现在的日期为unix的时间戳值  
4、 改变日期  
a. 增加时间  
b. 减去时间  
c. 找出两日期之间的间隔  
5、 为php添加dateadd函数  
6、 为php添加datediff函数  

**得到目前的日期和时间  

在unix中,时间的表示方式为计算从1970年1月1日零时起所过去的秒数,这称为unix 时间戳(unix epoch)。  
如果我们有这样一段的代码:  

?  
echo time();  
?


将返回值958905820  
而此时的时间为2000年5月21日12时43分。  
你也许会说这相当不错。当这对我毫无帮助,或者只有一点帮助。在PHP中,对日期处理的函数都必须用到由time()返回的时间戳值。同时,由于PHP在Unix和Windows系统中均使用同样的时间戳值,这就允许你不需要修改代码即可在不同的系统间移植。另外的一个好处是time()函数返回的是一个整数,你可以将其作为整数字段或文本字段存入数据库,而不必使用特别的日期/时间字段。  
你已经基本了解了Unix的时间戳值,现在让我们来展示它的实际用途。  

改变日期显示的方式-日期和时间的显示形式  

PHP提供两个办法来将Unix的时间戳值转换成为有用的数据。第一个是date()函数。这个函数有两个参数-第一个字符串用于设定你所希望返回的格式,第二个为Unix的时间戳值。  
格式化字符串通过一些简单的特殊格式化字符来显示你所希望看到的格式的日期和时间。假设你希望日期以这样的格式显示“18h01 Sunday 21 May”。  
我们需要对字符串中的每一部分使用一个特殊格式化字符,你可以从PHP手册中日期和时间函数库中找到。这样的特殊格式化字符数量不少,他们所表示的类似于星期几、月的英文名、用2位或4位数表示的年份,是否是上午(AM)或下午(PM)以及其他。对于这个例子我们需要的特殊字符为:  
‘H' -24 小时制的小时  
‘i'- 分钟  
‘l'- 星期几的英文全名  
‘d'- 本月的第几日  
‘F'- 月份的英文全名  
因此我们的格式化字符串为”Hhi l d F”, PHP代码为:  

?  
echo date ("Hhi l d F" ,time());  
?


当我们执行这段代码,我们发现我们所得到的结果为:  
180609 Sunday 21 May  
这样的结果看起来有些奇怪。让我们再查一下PHP手册,原来'h'所代表的是12 小时制的小时数。这再次证明了一句真理:“计算机只做你所告诉它该做的,而不是你想要它做的”。我们有两个选择。第一个是在h前使用转义字符“”:  
echo date ("Hhi l d F", time());  
我们得到这样的结果:  
18h12 Sunday 21 May  
这正是我们所要的。但如果我们在一个十分复杂的句子中需要包含日期和时间,我们是否需要对每个字符使用转义字符?  
答案当然是不。我们使用另一个函数strftime()。  
strftime()有两个好处。第一个好处我们并不在本文讨论范围内-如果你使用setlocale()函数,你可以通过strftime得到相应语言的月份的名称。另外的一个好处是你可以将特别的日期和时间的格式化字符包含在你的字符串中。这同时也意味着无论你是否要学习date()函数的所有特殊格式化字符,你都必须学习一整套完全不同的格式化字符。  
strftime()工作的方式和date()没有什么不同,除了特殊格式化字符的前面必须添加一个百分号%。如果用strftime()函数,前面例子的代码如下:  

?  
echo strftime ("%Hh%M %A %d %b" ,time());  
?


结果为:  
18h24 Sunday 21 May  
这也许看起来将简化繁,但考虑一下如果你所需要的显示的为"Today is Sunday 21 May 2000. The time is somewhere close to 18h24." 我想使用date()函数无疑令人感到厌烦。  
在开始的时候,我提及我们有两种方式可以从Unix时间戳值中得到有用的数据。我们刚刚了解了date()和strftime()。另一个getdate()。这个函数只需要Unix 的时间戳值作为参数,而函数的返回值为日期和时间的数组。  
下面是一个例子:  

?  
$date_time_array = getdate (time());  
echo $date_time_array[ "weekday"];  
?


返回的结果为:  
Sunday  
除了"weekday",该数组的其他部分为:  
"seconds" –秒  
"minutes" –分  
"hours" –小时  
“mday" - 本月的第几天  
"wday" -本周的第几天(数字)  
"mon" -月(数字)  
"year" –年  
"yday" - r本年的第几天(数字)  
"month" -月份全名  
我们现在可以得到容易辨认的日期和时间。那么其他呢?  

**转换现在的日期为Unix的时间戳值  

通常你必须处理一些日期或时间格式的数据。打开M$的一个Access数据库,所有的日期都以YYYY/MM/DD的格式存储,加入目前的日前即为2000/05/27。Mktime()函数可以将一个时间转换成Unix的时间戳值。  
函数的格式为:int mktime(int hour, int minute, int second, int month, int day, int year, int [is_dst] );  
从左往右你必须提供小时、分、秒、月、天和年。最后一个参数用于指定你是否处于夏令时,此参数是可选的,所以我们将忽略它。  
代码如下:  

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

?  
echo mktime (0, 0,0 ,5, 27,2000 );  
?


由于不知道小时、分和秒同时这些参数必须填写,我将其设置为0。设置为0意味着时间为午夜。  

?  
$access_date = "2000/05/27";  
//explode()函数用一个字符串作为分界来分解另一个字符串。这个例子$access_date通过字符串”/”来分解  
$date_elements = explode("/" ,$access_date);  
// 此时  
// $date_elements[0] = 2000  
// $date_elements[1] = 5  
// $date_elements[2] = 27  
echo mktime (0, 0,0 ,$date_elements [1], $date_elements[ 2],$date_elements [0]);  
?


我们看一个比从Access数据库单纯获得日期更复杂的情况,我们得到一个以下格式的日期和时间:2000/05/27 02:40:21 PM  

?  
// 来自Access的字符串  
$date_time_string = "2000/05/27 02:40:21 PM";  
// 将字符串分解成3部分-日期、时间和上午/下午  
$dt_elements = explode(" " ,$date_time_string);  
// 分解日期  
$date_elements = explode("/" ,$dt_elements[ 0]);  
// 分解时间  
$time_elements = explode(":" ,$dt_elements[ 1]);  
// 如果是下午,我们将时间增加12小时以便得到24小时制的时间  
if ($dt_elements [2]== "PM") { $time_elements[ 0]+=12;}  
// 输出结果  
echo mktime ($time_elements [0], $time_elements[ 1], $time_elements[ 2], $date_elements[1], $date_elements[2], $date_elements[0]);  
?

**修改日期  

有时我们需要知道6小时以后是什么时间,35天前的日期或者从你最后一次玩Quake3后已过去多少秒。我们已经知道如何用mktime()函数从单独的日期和时间中获得Unix的时间戳值。如果我们需要的并非目前日期和时间的Unix时间戳值,我们该咋办?下面是一些练习可以帮助说明我们后面所要做的。  
正如前面所见,mktime()使用以下参数:小时、分、秒、月、天和年。想想第二节,getdate()函数可以为我们获得这些参数。  

金戈企业建站系统0.1
金戈企业建站系统0.1

软件介绍:金戈企业建站系统不仅是一份免费的企业建站代码包,而且它还是完全开源的,它倾注了作者1个多月来日日夜夜的心血,虽然有些地方没做到尽善尽美,可我相信在接下来的日子里我会通过反馈信息让她更丰满实用起来。1.完美的摸板机制,即使你对php一点也不懂,只要你会做网页。就可以立即打造新颖别致的网站界面(摸板制作方法手册正在紧张制作中,稍后发布)可惜作者精力有限,目前只提供一套摸板。不过只是暂时的2.

下载
?  
// 将目前的时间戳值放入一数组内  
$timestamp = time();  
echo $timestamp;  
echo "p";  
$date_time_array = getdate( $timestamp);  
// 用mktime()函数重新产生Unix时间戳值  
$timestamp = mktime($date_time_array ["hours"], $date_time_array["minutes" ],$date_time_array[ "seconds"],$date_time_array ["mon"], $date_time_array["mday" ],$date_time_array[ "year"]);  
echo $timestamp;  
?


看起来有一些令人感到迷惑。我将用一些变量来使上面的程序看起来更容易了解。  

?  
// 将目前的时间戳值放入一数组内  
$timestamp = time();  
echo $timestamp;  
echo "p";  
$date_time_array = getdate( $timestamp);  
$hours = $date_time_array[ "hours"];  
$minutes = $date_time_array["minutes"];  
$seconds = $date_time_array[ "seconds"];  
$month = $date_time_array["mon"];  
$day = $date_time_array["mday"];  
$year = $date_time_array["year"];  
// 用mktime()函数重新产生Unix时间戳值  
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day,$year);  
echo $timestamp;  
?


现在我们将由getdate()所产生的时间戳值放入相对应的名称变量中,所以代码变得相对容易阅读和理解。现在如果我们需要在目前的时间上加上19个小时,我们用$hours+19代替mktime()函数中的$hours。mktime()将自动为我们将时间转到第二天。  

?  
// 将目前的时间戳值放入一数组内  
$timestamp = time();  
echo strftime( "%Hh%M %A %d %b",$timestamp);  
echo "p";  
$date_time_array = getdate($timestamp);  
$hours = $date_time_array["hours"];  
$minutes = $date_time_array["minutes"];  
$seconds = $date_time_array["seconds"];  
$month = $date_time_array["mon"];  
$day = $date_time_array["mday"];  
$year = $date_time_array["year"];  
// 用mktime()函数重新产生Unix时间戳值  
// 增加19小时  
$timestamp = mktime($hours + 19, $minutes,$seconds ,$month, $day,$year);  
echo strftime( "%Hh%M %A %d %b",$timestamp);  
echo "br~E after adding 19 hours";  
?


运行后得到:  
14h58 Saturday 03 Jun  
09h58 Sunday 04 Jun  
~E after adding 19 hours  
减少时间也是同样的-你只需要减少相应变量的值即可。  
得到两个不同时间值的差同样也是非常简单。你所需要做的只是将两个时间值转换为Unix的时间戳值,然后两者相减即可。两者之差即为两个时间所相隔的秒数。另外一些算法可以很快地将秒转为天、小时、分和秒。  

**为PHP添加DateAdd函数  

正如在文章一开始我所说的-写本文的原因是因为我在PHP中找不到类似ASP的DateDiff函数。在介绍完PHP是如何处理日期和时间,让我们将ASP中常用的两个函数移植到PHP。第一个函数是DateAdd。  
根据Vbscript的文档,DateAdd(interval,number,date)函数的定义为“返回已添加指定时间间隔的日期。”  
Inetrval为表示要添加的时间间隔字符串表达式,例如分或天;number为表示要添加的时间间隔的个数的数值表达式;Date表示日期。  
Interval(时间间隔字符串表达式)可以是以下任意值:  
yyyy year年  
q Quarter季度  
m Month月  
y Day of year一年的数  
d Day天  
w Weekday一周的天数  
ww Week of year周  
h Hour小时  
n Minute分  
s Second秒  
w、y和d的作用是完全一样的,即在目前的日期上加一天,q加3个月,ww加7天。  

?  
function DateAdd ($interval, $number, $date) {  
$date_time_array = getdate($date);  
$hours = $date_time_array["hours"];  
$minutes = $date_time_array["minutes"];  
$seconds = $date_time_array["seconds"];  
$month = $date_time_array["mon"];  
$day = $date_time_array["mday"];  
$year = $date_time_array["year"];  
switch ($interval) {  
case "yyyy": $year +=$number; break;  
case "q": $month +=($number*3); break;  
case "m": $month +=$number; break;  
case "y":  
case "d":  
case "w": $day+=$number; break;  
case "ww": $day+=($number*7); break;  
case "h": $hours+=$number; break;  
case "n": $minutes+=$number; break;  
case "s": $seconds+=$number; break;  
}  
$timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year);  
return $timestamp;}  
?  
我们可以将上面的代码保存为dateadd.inc文件,然后运行以下代码:  
?  
include('dateadd.inc');  
$temptime = time();  
echo strftime( "%Hh%M %A %d %b",$temptime);  
$temptime = DateAdd("n" ,50,$temptime);  
echo "p";  
echo strftime( "%Hh%M %A %d %b",$temptime);  
?


我们将得到:  
15h41 Saturday 03 Jun  
16h31 Saturday 03 Jun  
为PHP添加DateDiff函数  
现在DateAdd已经完成,那么DateDiff呢?  
根据文档,DateDiff(interval,date1,date2)函数的定义为“返回两个日期之间的时间间隔”。  
Intervals参数的用法与DateAdd函数中的相同。出于避免过于复杂的考虑,我们决定忽略Vbscript中DateDiff函数中其它复杂的参数,即其两个可选的参数变量[firstdayofweek[, firstweekofyear]](它们用于决定星期中第一天是星期天还是星期一和一年中第一周的常数。而且我们只允许intervals有以下五个值:"w"(周)、"d"(天)、"h"(小时)、"n"(分钟) 和"s"(秒)。  

Let's see what we can come up with: 下面的代码是我们所需要的:  

?  
Function DateDiff ($interval, $date1,$date2) {  
// 得到两日期之间间隔的秒数  
$timedifference = $date2 - $date1;  
switch ($interval) {  
case "w": $retval = bcdiv($timedifference ,604800); break;  
case "d": $retval = bcdiv( $timedifference,86400); break;  
case "h": $retval = bcdiv ($timedifference,3600); break;  
case "n": $retval = bcdiv( $timedifference,60); break;  
case "s": $retval = $timedifference; break;  
}  
return $retval;}  
?


将上面的代码存为datediff.inc文件,然后运行下面的代码:  

?  
include('datediff.inc');  
include('dateadd.inc');  
$currenttime = time();  
echo "Current time: ". strftime("%Hh%M %A %d %b" ,$currenttime)."br";  
$newtime = DateAdd ("n",50 ,$currenttime);  
echo "Time plus 50 minutes: ". strftime("%Hh%M %A %d %b" ,$newtime)."br";  
$temptime = DateDiff ("n",$currenttime ,$newtime);  
echo "Interval between two times: ".$temptime;  
?


如果一切顺利,你可以看到以下结果:  
Current time: 16h23 Saturday 03 Jun  
Time plus 50 minutes: 17h13 Saturday 03 Jun  
Interval between two times: 50  
如果你在Unix机器上运行PHP,你必须编译PHP支持BC高精度函数。你必须从以下地址http://www.php.net/extra/number4.tar.gz下载BC库,然后将其解压到PHP4的根目录下,重新编译PHP,编译时要加上--enable-bcmath的选项。(详细说明见PHP4中README.BCMATH)。PHP4的Windows版本则不需要做任何修补即可直接使用BC高精度函数。  
现在你已经得到处理日期和时间的函数,剩下的就是如何将其运用到你的PHP程序中

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

164

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

34

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

73

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

72

2026.01.26

热门下载

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

精品课程

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

共137课时 | 9.9万人学习

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

共6课时 | 11.2万人学习

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

共13课时 | 0.9万人学习

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

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