专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »PHP教程 » php日期:PHP中的日期处理 »正文

php日期:PHP中的日期处理

来源: 发布时间:星期一, 2009年1月12日 浏览:2次 评论:0
  我正打算用PHP编写种帮助处理系统我发现我必须知道处理完最后位客户问题后已经过去了多长时间?当我过去用ASP时解决这个问题相当简单ASP有相应DateDf可以给出两个日期间间隔多少月、多少天和多少秒当我搜寻完PHP手册后我发现PHP并没有类似

  本文包含以下内容:

  1、 得到目前日期和时间-我们有多少种方式?

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

  3、 转换现在日期为Unix时间戳值

  4、 改变日期

  a. 增加时间

  b. 减去时间

  c. 找出两日期的间间隔

  5、 为PHP添加DateAdd

  6、 为PHP添加DateDf

  **得到目前日期和时间

  在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这个有两个参数-第串用于设定你所希望返回格式第 2个为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有两个好处个好处我们并不在本文讨论范围内-如果你使用locale你可以通过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_.gif' /> = getdate (time);

  echo $date_time_.gif' />[ "weekday"];

  ?

  返回结果为:

  Sunday

  除了"weekday"其他部分为:

  "seconds" ?秒

  "minutes" ?分

  "hours" ?小时

  “mday" - 本月第几天

  "wday" -本周第几天(数字)

  "mon" -月(数字)

  "year" ?年

  "yday" - r本年第几天(数字)

  "month" -月份全名

  我们现在可以得到容易辨认日期和时间那么其他呢?

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

  通常你必须处理些日期或时间格式数据打开M$个Access数据库所有日期都以YYYY/MM/DD格式存储加入目前日前即为2000/05/27Mktime可以将个时间转换成Unix时间戳值

  格式为: mktime( hour, minute, second, month, day, year, [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_ = "2000/05/27 02:40:21 PM";

  // 将串分解成3部分-日期、时间和上午/下午

  $dt_elements = explode(" " ,$date_time_);

  // 分解日期

  $date_elements = explode("/" ,$dt_elements[ 0]);

  // 分解时间

  $time_elements = explode(":" ,$dt_elements[ 1]);

  // 如果是下午我们将时间增加12小时以便得到24小时制时间

   ($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使用以下参数:小时、分、秒、月、天和年想想第 2节getdate可以为我们获得这些参数

  ?

  // 将目前时间戳值放入

  $timestamp = time;

  echo $timestamp;

  echo "p";

  $date_time_.gif' /> = getdate( $timestamp);

  // 用mktime重新产生Unix时间戳值

  $timestamp = mktime($date_time_.gif' /> ["hours"], $date_time_.gif' />["minutes" ],$date_time_.gif' />[ "seconds"],$date_time_.gif' /> ["mon"], $date_time_.gif' />["mday" ],$date_time_.gif' />[ "year"]);

  echo $timestamp;

  ?

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

  ?

  // 将目前时间戳值放入

  $timestamp = time;

  echo $timestamp;

  echo "p";

  $date_time_.gif' /> = getdate( $timestamp);

  $hours = $date_time_.gif' />[ "hours"];

  $minutes = $date_time_.gif' />["minutes"];

  $seconds = $date_time_.gif' />[ "seconds"];

  $month = $date_time_.gif' />["mon"];

  $day = $date_time_.gif' />["mday"];

  $year = $date_time_.gif' />["year"];

  // 用mktime重新产生Unix时间戳值

  $timestamp = mktime($hours ,$minutes, $seconds,$month ,$day,$year);

  echo $timestamp;

  ?

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

  ?

  // 将目前时间戳值放入

  $timestamp = time;

  echo strftime( "%Hh%M %A %d %b",$timestamp);

  echo "p";

  $date_time_.gif' /> = getdate($timestamp);

  $hours = $date_time_.gif' />["hours"];

  $minutes = $date_time_.gif' />["minutes"];

  $seconds = $date_time_.gif' />["seconds"];

  $month = $date_time_.gif' />["mon"];

  $day = $date_time_.gif' />["mday"];

  $year = $date_time_.gif' />["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中找不到类似ASPDateDf在介绍完PHP是如何处理日期和时间让我们将ASP中常用两个移植到PHP是DateAdd

  根据Vbscript文档DateAdd(erval,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 ($erval, $number, $date) {

  $date_time_.gif' /> = getdate($date);

  $hours = $date_time_.gif' />["hours"];

  $minutes = $date_time_.gif' />["minutes"];

  $seconds = $date_time_.gif' />["seconds"];

  $month = $date_time_.gif' />["mon"];

  $day = $date_time_.gif' />["mday"];

  $year = $date_time_.gif' />["year"];

  switch ($erval) {

   "yyyy": $year $number; ;

   "q": $month ($number*3); ;

   "m": $month $number; ;

   "y":

   "d":

   "w": $day$number; ;

   "ww": $day($number*7); ;

   "h": $hours$number; ;

   "n": $minutes$number; ;

   "s": $seconds$number; ;

  }

  $timestamp = mktime($hours ,$minutes, $seconds,$month ,$day, $year);

   $timestamp;}

  ?

  我们可以将上面代码保存为dateadd.inc文件然后运行以下代码:

  ?

  ('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添加DateDf

  现在DateAdd已经完成那么DateDf呢?

  根据文档DateDf(erval,date1,date2)定义为“返回两个日期的间时间间隔”

  Intervals参数使用方法和DateAdd相同出于避免过于复杂考虑我们决定忽略Vbscript中DateDf中其它复杂参数即其两个可选参数变量[firstdayofweek[, firstweekofyear]](它们用于决定星期中第天是星期天还是星期年中第常数而且我们只允许ervals有以下 5个值:"w"(周)、"d"(天)、"h"(小时)、"n"(分钟) 和"s"(秒)

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

  ?

  Function DateDf ($erval, $date1,$date2) {

  // 得到两日期的间间隔秒数

  $timedference = $date2 - $date1;

  switch ($erval) {

   "w": $retval = bcdiv($timedference ,604800); ;

   "d": $retval = bcdiv( $timedference,86400); ;

   "h": $retval = bcdiv ($timedference,3600); ;

   "n": $retval = bcdiv( $timedference,60); ;

   "s": $retval = $timedference; ;

  }

   $retval;}

  ?

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

  ?

  ('datedf.inc');

  ('dateadd.inc');

  $currenttime = time;

  echo "Current time: ". strftime("%Hh%M %A %d %b" ,$currenttime)."br";

  $time = DateAdd ("n",50 ,$currenttime);

  echo "Time plus 50 minutes: ". strftime("%Hh%M %A %d %b" ,$time)."br";

  $temptime = DateDf ("n",$currenttime ,$time);

  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)PHP4Windows版本则不需要做任何修补即可直接使用BC高精度



  现在你已经得到处理日期和时间剩下就是如何将其运用到你PHP



相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: