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] ); 
从左往右你必须提供小时、分、秒、月、天和年。最后一个参数用于指定你是否处于夏令时,此参数是可选的,所以我们将忽略它。 
代码如下: 

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()函数可以为我们获得这些参数。 

// 将目前的时间戳值放入一数组内 
$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程序中

(0)

相关推荐

  • PHP下获取上个月、下个月、本月的日期(strtotime,date)

    今天写程序的时候,突然发现了很早以前写的获取月份天数的函数,经典的switch版,但是获得上月天数的时候,我只是把月份-1了,估计当时太困了吧,再看到有种毛骨悚然的感觉,本来是想再处理一下的,但是一想肯定还有什么超方便的方法,于是找到了下面这个版本,做了一点小修改. 获取本月日期: 复制代码 代码如下: function getMonth($date){     $firstday = date("Y-m-01",strtotime($date));     $lastday = da

  • php获取指定日期之间的各个周和月的起止时间

    根据指定的前后两个日期,计算这两个日期之间各个周的起始时间和结束时间,以及各个月的起始时间和结束时间 日志格式化类 Date.class.php 复制代码 代码如下: <?php class Datefmt{    function __construct() {}   /**    * 根据指定日期获取所在周的起始时间和结束时间    */   public function get_weekinfo_by_date($date) {     $idx = strftime("%u&qu

  • php使用cookie显示用户上次访问网站日期的方法

    本文实例讲述了php使用cookie显示用户上次访问网站日期的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?php if(!empty($_COOKIE['lastvisit'])){//先判断,是否存在cookie  echo "您上次访问时间是:".$_COOKIE['lastvisit'];  setCookie("lastvisit",date("Y-m-d H:i:s"),time()+3600*24*

  • 如何使用PHP获取指定日期所在月的开始日期与结束日期

    复制代码 代码如下: /**     * 获取指定日期所在月的开始日期与结束日期     * @param string $date     * @param boolean 为true返回开始日期,否则返回结束日期     * @return array     * @access private     */    private function getMonthRange( $date, $returnFirstDay = true ) {        $timestamp = str

  • PHP中的日期加减方法示例

    几乎所有从事程序开发的程序员都遇到时间处理问题,PHP开发也一样,幸运的是PHP提供了很多关于日期时间函数.只要经常使用这些函数,搭配使用,日期时间处理上就熟能生巧了. 今天要讲的这个例子,需求是这样的.得知某个日期时间, 如:2012-04-25 10:10:00 我要在这个日期时间的基础上加上5个月并返回处理后的日期 结果:2012-04-25 10:10:00 加5个月等于 2012-09-25 10:10:00 这个需求看似简单,但还是有点棘手,因为PHP没有直接提供yyyy-mm-dd

  • PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)

    废话不多少,上代码 复制代码 代码如下: // 获取指定日期所在星期的开始时间与结束时间 function getWeekRange($date){     $ret=array();     $timestamp=strtotime($date);     $w=strftime('%u',$timestamp);     $ret['sdate']=date('Y-m-d 00:00:00',$timestamp-($w-1)*86400);     $ret['edate']=date('

  • PHP获取一年中每个星期的开始和结束日期的方法

    本文实例讲述了PHP获取一年中每个星期的开始和结束日期的方法.分享给大家供大家参考.具体分析如下: 最近项目中需要做个提交周报的功能,需要知道指定周数的开始日期和结束日期,以便处理其他业务.以下是一段通过PHP来获取一年中的每星期的开始日期和结束日期的代码,与大家分享. 以下是一段通过PHP来获取一年中的每星期的开始日期和结束日期的代码. function get_week($year) { $year_start = $year . "-01-01"; $year_end = $ye

  • 用php获取本周,上周,本月,上月,本季度日期的代码

    复制代码 代码如下: echo date("Ymd",strtotime("now")), "\n"; echo date("Ymd",strtotime("-1 week Monday")), "\n"; echo date("Ymd",strtotime("-1 week Sunday")), "\n"; echo date

  • php date与gmdate的获取日期的区别

    date -- 格式化一个本地时间/日期 gmdate -- 格式化一个 GMT/UTC 日期/时间,返回的是格林威治标准时(GMT). 举个例子,我们现在所在的时区是+8,那么服务器运行以下脚本返回的时间应该是这样的: 当前时间假定是2007-03-14 12:15:27 echo date('Y-m-d H:i:s', time()); 输出为:2007-03-14 12:15:27 echo gmdate('Y-m-d H:i:s', time()); 输出为:2007-03-14 04:

  • PHP中的日期处理方法集锦

    本文包含以下内容:  1. 得到目前的日期和时间-我们有多少种方式?  2. 改变日期显示的方式-日期和时间的显示形式  3. 转换现在的日期为Unix的时间戳值  4. 改变日期  a. 增加时间  b. 减去时间  c. 找出两日期之间的间隔  5. 为PHP添加DateAdd函数  6. 为PHP添加DateDiff函数 **得到目前的日期和时间 在Unix中,时间的表示方式为计算从1970年1月1日零时起所过去的秒数,这称为UNIX 时间戳(Unix Epoch).  如果我们有这样一段

  • 转换layUI的数据表格中的日期格式方法

    转换layUI的数据表格中的日期格式 前端jsp代码 <table class="layui-table" style="width:100%" lay-data="{url:'/why123/user/findUserAll?userType=0', page:true, id:'idTest'}" lay-filter="demo"> <thead> <tr> <th lay-da

  • ios开发中时间转换的方法集锦

    在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如: //实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //设定时间格式,这里可以设置成自己需要的格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //用[NSDate d

  • JavaScript 中的日期和时间及表示标准介绍

    前言 本篇的介绍涵盖以下部分: 1. 时间标准指的是什么?UCT和GMT 的概念.关联和区别? 2. 时间表示标准有哪些? 3. JS 中时间的处理 日期时间标准 日期的标准就不多说了 -- 公元纪年 是为纪念犹太人耶稣(基督)的诞生.他诞生的那一年为公元1年,诞生之前的年份称为"公元前n年" 简单来说,时间的标准就是以什么时间为起点开始计时.对于年份来说,举例来说,如果不使用公元纪年法,估计全世界交流起来就困难重重了(新中国54年,估计很把很多老外整晕) 时间标准其实挺多的. 原子时

  • jQuery EasyUI中的日期控件DateBox修改方法

    jQuery EasyUI中的日期控件DateBox很好用的,首先需要引入jquery文件,代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Basic DateBox - jQuery EasyUI Demo</title> <link rel="stylesheet" type="text/cs

  • Python从Excel中读取日期一列的方法

    如下所示: import xlrd import datetime file=u"伏特加.xls"#注意读中文文件名稍微处理一下 data=xlrd.open_workbook(file) table = data.sheet_by_index(0)#按照索引读Excel文件 colContent=table.col_values(1)#读某一列,日期在第二列 nrows=table.nrows #行数 print nrows ncols = table.ncols#列数 print

  • ASP中格式化时间短日期补0变两位长日期的方法

    因为短日期不足2位,所以在网页排版的时候,影响美观,下面两个函数可以解决这个问题. 2020-2-7短日期 变 2020-02-07长日期 Function FStime(times) Dim years,months,days if len(times)=0 then exit function years=year(times) months=right("0"&month(times),2) days=right("0"&day(times),

  • 详解在java中进行日期时间比较的4种方法

    1. Date.compareTo() java.util.Date提供了在Java中比较两个日期的经典方法compareTo(). 如果两个日期相等,则返回值为0. 如果Date在date参数之后,则返回值大于0. 如果Date在date参数之前,则返回值小于0. @Test void testDateCompare() throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

  • javascript中一些奇葩的日期换算方法总结

    前言 本文给大家总结了一些关于javascript奇葩的日期换算方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 日期换算 1.获取今天的0时0分0秒(常用于开始日期的获取) new Date(new Date().toLocaleDateString()); // Mon Nov 12 2018 00:00:00 GMT+0800 (中国标准时间) 2.获取一个月前的日期 new Date(new Date().setMonth(new Date().getMonth()-

  • 深入学习JavaScript的AngularJS框架中指令的使用方法

    指令(Directives)是所有AngularJS应用最重要的部分.尽管AngularJS已经提供了非常丰富的指令,但还是经常需要创建应用特定的指令.这篇教程会为你讲述如何自定义指令,以及介绍如何在实际项目中使用.在这篇文章的最后(第二部分),我会指导你如何使用Angular指令来创建一个简单的记事本应用. 概述 一个指令用来引入新的HTML语法.指令是DOM元素上的标记,使元素拥有特定的行为.举例来说,静态的HTML不知道如何来创建和展现一个日期选择器控件.让HTML能识别这个语法,我们需要

随机推荐