*修改日期
有时我们需要知道6小时以后是什么时间,35天前的日期或者从你最后一次玩Quake3后已过去多少秒。我们已经知道如何用mktime()函数从单独的日期和时间中获得Unix的时间戳值。如果我们需要的并非目前日期和时间的Unix时间戳值,我们该咋办?下面是一些练习可以帮助说明我们后面所要做的。
正如前面所见,mktime()使用以下参数:小时、分、秒、月、天和年。想想第二节,getdate()函数可以为我们获得这些参数。
- <?
- // 将目前的时间戳值放入一数组内
- $timetimestamp = 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;
- ? >
看起来有一些令人感到迷惑。我将用一些变量来使上面的程序看起来更容易了解。
- <?
- // 将目前的时间戳值放入一数组内
- $timetimestamp = 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()将自动为我们将时间转到第二天。
- <?
- // 将目前的时间戳值放入一数组内
- $timetimestamp = 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程序中。
(责任编辑:admin) |