前面的话

  在Web程序开发时,时间发挥着重要的作用,不仅在数据存储和显示时需要日期和时间的参与,好多功能模块的开发,时间通常都是至关重要的。网页静态化需要判断缓存时间、页面访问消耗的时间需要计算、根据不同的时间段提供不同的业务等都离不开时间。PHP为我们提供了强大的日期和时间处理功能,通过内置的时间和日期函数库,不仅能够得到PHP程序在运行时所在服务器中的日期和时间,还可以对它们进行任意检查和格式化,以及在不同格式之间进行转换等。本文将详细介绍PHP中的日期和时间

  [注意]关于javascript的日期和时间相关内容请移步至此

时间戳

  UNIX时间戳是保存日期和时间的一种紧凑简洁的方法,是大多数UNIX系统中保存当前日期和时间的一种方法,也是在大多数计算机语言中表示日期和时间的一种标准格式。UNIX时间戳是从1970年1月1日0点(UTC/GMT的午夜)开始起到当前时间所经过的秒数

  因为UNIX时间戳是一个32位的数字格式,所以特别适用于计算机处理,例如计算两个时间点之间相差的天数。另外,由于文化和地区的差异,存在不同的时间格式,以及时区的问题。所以,UNIX时间戳也是根据一个时区进行标准化而设计的一种通用格式,并且这种格式可以很容易地转换为任何格式

  也因为UNIX时间戳是一个32位的整数表示的,所以在处理1902年以前或2038年以后的事件,将会遇到一些问题。另外,在Window下,由于时间戳不能为负数,如果使用PHP中提供的时间戳函数处理1970年之前的日期,就会发生错误。要使PHP代码具有可移植性,必须牢记这一点

【strtotime()】

  strtotime()预期接受一个包含美国英语日期格式的字符串并尝试将其解析为Unix时间戳(自January 1 1970 00:00:00 GMT 起的秒数),其值相对于now参数给出的时间,如果没有提供此参数则用系统当前时间

  1. int strtotime ( string $time [, int $now = time() ] )
  1. <?php
  2. echo strtotime("now"), "\n";//
  3. echo strtotime("10 September 2000"), "\n";//
  4. echo strtotime("+1 day"), "\n";//
  5. echo strtotime("+1 week"), "\n";//
  6. echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";//
  7. echo strtotime("next Thursday"), "\n";//
  8. echo strtotime("last Monday"), "\n";//
  9. ?>
  1. <?php
  2. $t ="1989-03-01 01:00:00";
  3. echo strtotime($t);//
  4. date_default_timezone_set('PRC');
  5. $t ="1989-03-01 01:00:00";
  6. echo strtotime($t);//
  7. ?>

【time()】

  time()返回当前的 Unix 时间戳

  1. int time ( void )
  1. <?php
  2. $nextWeek = time() + (7 * 24 * 60 * 60);// 7 days; 24 hours; 60 mins; 60 secs
  3. echo 'Now: '. date('Y-m-d') ."\n";//Now: 2017-02-28
  4. echo 'Next Week: '. date('Y-m-d', $nextWeek) ."\n";//Next Week: 2017-03-07
  5. echo 'Next Week: '. date('Y-m-d', strtotime('+1 week')) ."\n";// Next Week: 2017-03-07
  6. ?>

【date()】

  date()格式化一个本地时间/日期,返回将整数timestamp按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp是可选的,默认值为time()

  1. string date ( string $format [, int $timestamp ] )

  format参数如下所示


  1. d 月份中的第几天,有前导零的 2 位数字 01 31
  2. D 星期中的第几天,文本表示,3 个字母 Mon Sun
  3. j 月份中的第几天,没有前导零 1 31
  4. l 星期几,完整的文本格式 Sunday Saturday
  5. N ISO-8601 格式数字表示的星期中的第几天 1(表示星期一)到 7(表示星期天)
  6. S 每月天数后面的英文后缀,2 个字符 stndrd 或者 th。可以和 j 一起用
  7. w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
  8. z 年份中的第几天 0 365
  9.  
  10. 星期
  11. W ISO-8601 格式年份中的第几周,每周从星期一开始 42(当年的第 42 周)
  12.  

  13. F 月份,完整的文本格式, JanuaryMarch January December
  14. m 数字表示的月份,有前导零 01 12
  15. M 三个字母缩写表示的月份 Jan Dec
  16. n 数字表示的月份,没有前导零 1 12
  17. t 给定月份所应有的天数 28 31
  18.  

  19. L 是否为闰年 如果是闰年为 1,否则为 0
  20. o ISO-8601 格式年份数字 1999 or 2003
  21. Y 4 位数字完整表示的年份 1999 2003
  22. y 2 位数字表示的年份 99 03
  23.  
  24. 时间
  25. a 小写的上午和下午值 am pm
  26. A 大写的上午和下午值 AM PM
  27. B Swatch Internet 标准时 000 999
  28. g 小时,12 小时格式,没有前导零 1 12
  29. G 小时,24 小时格式,没有前导零 0 23
  30. h 小时,12 小时格式,有前导零 01 12
  31. H 小时,24 小时格式,有前导零 00 23
  32. i 有前导零的分钟数 00 59
  33. s 秒数,有前导零 00 59
  34. u 毫秒 654321
  35.  
  36. 时区
  37. e 时区标识(PHP 5.1.0 新加) UTCGMTAtlantic/Azores
  38. I 是否为夏令时 如果是夏令时为 1,否则为 0
  39. O 与格林威治时间相差的小时数 +0200
  40. P 小时和分钟之间有冒号分隔 +02:00
  41. T 本机所在的时区 ESTMDT
  42. Z 时差偏移量的秒数 -43200 43200
  43.  
  44. 完整的日期/时间
  45. c ISO 8601 格式的日期 2004-02-12T15:19:21+00:00
  46. r RFC 822 格式的日期 Thu, 21 Dec 2000 16:01:07 +0200
  47. U Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数
  1. <?php
  2. // 设定要用的默认时区。自 PHP 5.1 可用
  3. date_default_timezone_set('UTC');
  4.  
  5. //Tuesday
  6. echo date("l");
  7.  
  8. // Tuesday 28th of February 2017 05:41:19 AM
  9. echo date('l dS \of F Y h:i:s A');
  10.  
  11. //July 1, 2000 is on a Saturday
  12. echo "July 1, 2000 is on a " . date("l", mktime(0, 0, 0, 7, 1, 2000));
  13.  
  14. // Tue, 28 Feb 2017 05:41:19 +0000
  15. echo date(DATE_RFC2822);
  16.  
  17. // 2000-07-01T00:00:00+00:00
  18. echo date(DATE_ATOM, mktime(0, 0, 0, 7, 1, 2000));
  19. ?>
  1. <?php
  2. $t = time();
  3. echo date("Y-m-d H:i:s")."<br>";//2017-02-28 06:56:42
  4. echo date("Y/m/d H:i:s", $t)."<br>";//2017/02/28 06:56:42
  5. echo date("Y年m月d日 H:i:s", $t)."<br>";//2017年02月28日 06:56:42
  6. ?>

【mktime()】

  在PHP中,如果需要将日期和时间转换为UNIX时间戳,可以调用mktime()函数

  mktime()Unix时间戳,参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值

  1. int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )
  1. <?php
  2.  
  3. // Prints something like: 2006-04-05T01:02:03+00:00
  4. echo date('c', mktime(1, 2, 3, 4, 5, 2006));
  5. ?>

  mktime()在做日期计算和验证方面很有用,它会自动计算超出范围的输入的正确值

  1. <?php
  2. $t = mktime(1, 0, 0, 01, 03, 1989);
  3. echo date('y-m-d H:i:s',$t) .'<br>';//89-01-03 01:00:00
  4. $t = mktime(1, 0, 0, 01, 43, 1989);
  5. echo date('y-m-d H:i:s',$t) .'<br>';//89-02-12 01:00:00
  6. ?>

时区

  每个地区都有自己的本地时间,在网上及无级电通信中,时间的转换问题显得格外突出。整个地球分为24个时区,每个时区都有自己的本地时间。为了统一起见,使用一个统一的时间,称为通用协调时(Universal Time Coordinated,UTC),是由世界时间标准设定的全球标准时间

  PHP默认的时区设置是UTC时间,而北京位于时区的东8区,领先UTC8个小时,所以在使用time()等函数时,并不能得到正确的时间。可以通过以下两种方式来修改时区

  1、修改配置文件

  如果使用的是独立的服务器,有权限修改配置文件,设置时区就可以通过修改php.ini中的date.timezone属性完成,可以将这个属性的值设置为"Asia/Shang"、"Asia/Chongqing"、"Etc/GMT-8"或"PRC"中的一个

  2、调用函数

  可以通过调用函数date_default_timezone_set()函数来设置时区

  1. date_default_timezone_set('PRC');
  1. <?php
  2. echo date("Y-m-d H:i:s")."<br>";//2017-02-28 07:06:05
  3. date_default_timezone_set('PRC');
  4. echo date("Y-m-d H:i:s")."<br>";//2017-02-28 14:06:05
  5. ?>

  date_default_timezone_get()函数可以用来获取当前的默认时区

  1. <?php
  2. echo date_default_timezone_get();//Europe/Paris
  3. date_default_timezone_set('PRC');
  4. echo date_default_timezone_get();//PRC
  5. ?>

微秒

  在PHP中,大多数的时间格式都是以UNIX时间戳来表示的,而UNIX时间戳是心秒为最小的计量时间的单位。这对于某些应用程序来说不够准确,所以可以调用microtime()返回当前UNIX时间戳和微秒数

  1. mixed microtime ([ bool $get_as_float ] )

  如果给出了 get_as_float 参数并且其值等价于 TRUE,microtime() 将返回一个浮点数

  1. <?php
  2. echo microtime() ."<br>";//0.72119500 1488282853
  3. echo microtime(true) ;//1488282853.7212
  4. ?>

  microtime()函数常用于性能分析

  1. <?php
  2. date_default_timezone_set("PRC");
  3. $start = microtime(true);
  4. for($i=0; $i<100000; $i++);
  5. $end = microtime(true);
  6. echo $end-$start;//0.0067892074584961
  7. ?>

获取时间

  前面介绍的date()函数用于设置时间,而getdate()函数则主要用于获取时间

  1. array getdate ([ int $timestamp = time() ] )

  该函数将根据timestamp得出的包含有日期信息的关联数组array。如果没有给出时间戳则认为是当前本地时间

  返回的关联数组中的键名单元有以下几个

  1. 键名   说明 返回值例子
  2. "seconds" 秒的数字表示 0 59
  3. "minutes" 分钟的数字表示 0 59
  4. "hours" 小时的数字表示 0 23
  5. "mday" 月份中第几天的数字表示 1 31
  6. "wday" 星期中第几天的数字表示 0 (周日) 6 (周六)
  7. "mon" 月份的数字表示 1 12
  8. "year" 4 位数字表示的完整年份 1999 2003
  9. "yday" 一年中第几天的数字表示 0 365
  10. "weekday" 星期几的完整文本表示 Sunday Saturday
  11. "month" 月份的完整文本表示, January March January December
  12. 0 自从 Unix 纪元开始至今的秒数,和 time() 的返回值以及用于 date() 的值类似
  1. <?php
  2. date_default_timezone_set('PRC');
  3. //Array ( [seconds] => 8 [minutes] => 4 [hours] => 20 [mday] => 28 [wday] => 2 [mon] => 2 [year] => 2017 [yday] => 58 [weekday] => Tuesday [month] => February [0] => 1488283448 )
  4. print_r(getdate())."<br>";
  5. //Array ( [seconds] => 0 [minutes] => 0 [hours] => 0 [mday] => 1 [wday] => 6 [mon] => 1 [year] => 2000 [yday] => 0 [weekday] => Saturday [month] => January [0] => 946656000 )
  6. print_r(getdate(strtotime('2000-1-1 0:0:0')));
  7. ?>

日历

  下面使用面向对象的写法,完成一个简单的日历控件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <style>
  7. body{margin: 0;}
  8. .active{color:white;background-color: blue;}
  9. table{text-align:center;table-layout:fixed;border-collapse:collapse;width:400px;}
  10. </style>
  11. </head>
  12. <body>
  13. <?php
  14. class Calendar{
  15. private $year; //当前年
  16. private $month; //当前月
  17. private $start_weekday; //当前月的第一天对应的周几
  18. private $days; //当前月总天数
  19. private $out; //用于构造日历
  20.  
  21. //构造方法,用来初始化一些日期属性
  22. function __construct(){
  23. //如果用户没有设置年份,则使用当前系统时间的年份
  24. $this->year = isset($_GET['year']) ? $_GET['year'] : date('Y');
  25. //如果用户没有设置月份,则使用当前系统时间的月份
  26. $this->month = isset($_GET['month']) ? $_GET['month'] : date('m');
  27. //利用date()函数的w参数获取当前月第一天对应周几
  28. $this->start_weekday = date("w", mktime(0,0,0, $this->month, 1, $this->year));
  29. //利用date()函数的t参数获取当前月的天数
  30. $this->days = date("t", mktime(0,0,0, $this->month, 1, $this->year));
  31. }
  32.  
  33. //魔术方法,用于打印整个日历
  34. function __tostring(){
  35. global $out;
  36. $out .='<table>';//日历以表格形式打印
  37. $out .=$this->changeDate();//用户自己设置日期
  38. $out .=$this->weeksList();//打印周列表
  39. $out .=$this->daysList();//打印日列表
  40. $out .='</table>';//表格结束
  41.  
  42. return $out;
  43. }
  44.  
  45. //输出周列表
  46. private function weeksList(){
  47. global $out;
  48. $week = array('日','一','二','三','四','五','六');
  49. $out .= '<tr>';
  50. for($i = 0; $i < count($week); $i++){
  51. $out .= '<th>' .$week[$i] .'</th>';
  52. }
  53. $out.= '</tr>';
  54.  
  55. }
  56.  
  57. //输出日列表
  58. private function daysList(){
  59. global $out;
  60. $out .= '<tr>';
  61. //输出空格
  62. for($j = 0; $j < $this->start_weekday; $j++){
  63. $out .= '<td>&nbsp;</td>';
  64. }
  65. //输出日期
  66. for($k = 1; $k <= $this->days; $k++){
  67. $j++;
  68. if($k == date('d')){
  69. $out .= '<td class="active">' .$k .'</td>';
  70. }else{
  71. $out .= '<td>'.$k .'</td>';
  72. }
  73.  
  74. //换行
  75. if($j % 7 == 0){
  76. $out .= '</tr><tr>';
  77. }
  78. }
  79.  
  80. //补齐空格
  81. while($j % 7 !== 0){
  82. $out .= '<td>&nbsp;</td>';
  83. $j++;
  84. }
  85.  
  86. $out.= '</tr>';
  87.  
  88. }
  89.  
  90. //处理上一年数据
  91. private function prevYear($year,$month){
  92. $year = $year - 1;
  93. if($year < 1970){
  94. $year = 1970;
  95. }
  96. return "year={$year}&month={$month}";
  97. }
  98.  
  99. //处理上一月数据
  100. private function prevMonth($year,$month){
  101. if($month == 1){
  102. $year = $year - 1;
  103. if($year < 1970){
  104. $year = 1970;
  105. }
  106. $month = 12;
  107. }else{
  108. $month --;
  109. }
  110. return "year={$year}&month={$month}";
  111. }
  112.  
  113. //处理下一年数据
  114. private function nextYear($year,$month){
  115. $year = $year + 1;
  116. if($year > 2038){
  117. $year = 2038;
  118. }
  119. return "year={$year}&month={$month}";
  120. }
  121.  
  122. //处理下一月数据
  123. private function nextMonth($year,$month){
  124. if($month == 12){
  125. $year = $year + 1;
  126. if($year < 1970){
  127. $year = 1970;
  128. }
  129. $month = 1;
  130. }else{
  131. $month ++;
  132. }
  133. return "year={$year}&month={$month}";
  134. }
  135.  
  136. //改变日期
  137. private function changeDate($url="1.php"){
  138. global $out;
  139. $out .='<tr>';
  140. $out .='<td><a href="' .$url .'?' .$this->prevYear($this->year,$this->month) .'">' .'前一年' .'</a></td>';
  141. $out .='<td><a href="' .$url .'?' .$this->prevMonth($this->year,$this->month) .'">' .'前一月' .'</a></td>';
  142. $out .= '<td colspan="3">';
  143. $out .='<form>';
  144. $out .='<select name="year" onchange="window.location=\''.$url.'?year=\'+this.options[selectedIndex].value+\'&month='.$this->month.'\'">';
  145. for($sy=1970;$sy<=2038;$sy++){
  146. $selected = ($sy==$this->year) ? "selected" : "";
  147. $out .='<option '.$selected .' value="' .$sy .'">' .$sy .'</option>';
  148. };
  149. $out .= '</select>';
  150. $out .= '<select name="month" onchange="window.location=\''.$url.'?year='.$this->year.'&month=\'+this.options[selectedIndex].value">';
  151. for($sm=1;$sm<=12;$sm++){
  152. $selected1 = ($sm==$this->month) ? "selected" : "";
  153. $out .='<option '.$selected1 .' value="' .$sm .'">' .$sm .'</option>';
  154. }
  155. $out .= '</select>';
  156. $out .= '</form>';
  157.  
  158. $out .= '</td>';
  159. $out .= '<td><a href="'.$url.'?'.$this->nextYear($this->year,$this->month).'">'.'后一年'.'</a></td>';
  160. $out .= '<td><a href="'.$url.'?'.$this->nextMonth($this->year,$this->month).'">'.'后一月'.'</a></td>';
  161. $out .= '</tr>';
  162.  
  163. }
  164. }
  165.  
  166. echo new Calendar();
  167. ?>
  168. </body>
  169. </html>

前端学PHP之日期与时间的更多相关文章

  1. [Java]Java日期及时间库插件 -- Joda Time.

    来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处 ...

  2. 使用moment.js轻松管理日期和时间

    大家在前端Javascript开发中会遇到处理日期时间的问题,经常会拿来一大堆处理函数才能完成一个简单的日期时间显示效果.今天我给大家介绍一个轻量级的Javascript日期处理类库:moment.j ...

  3. Linux C 中获取local日期和时间 time()&localtime()函数

    1.  time() 函数 /* time - 获取计算机系统当前的日历时间(Calender Time) * 处理日期时间的函数都是以本函数的返回值为基础进行运算 * * 函数原型: * #incl ...

  4. datetime 模块详解 -- 基本的日期和时间类型

    转自:https://www.cnblogs.com/fclbky/articles/4098204.html datetime 模块提供了各种类用于操作日期和时间,该模块侧重于高效率的格式化输出 在 ...

  5. Flask学习之十三 日期和时间

    英文博客地址:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiii-dates-and-times 中文翻译地址: ...

  6. Python标准库:datetime 时间和日期模块 —— 时间的获取和操作详解

    datetime 时间和日期模块 datetime 模块提供了以简单和复杂的方式操作日期和时间的类.虽然支持日期和时间算法,但实现的重点是有效的成员提取以进行输出格式化和操作.该模块还支持可感知时区的 ...

  7. 前端学做 PPT

    前端学做 PPT 公司做技术分享.年终总结都需要用到ppt. 要快速.省事的做出高质量的 ppt,一方面需要熟练使用制作 ppt 的工具,另一方面得知道用工具做成什么样子才是好作品.前者比较简单,后者 ...

  8. 前端学HTTP之报文首部

    前面的话 首部和方法配合工作,共同决定了客户端和服务器能做什么事情.在请求和响应报文中都可以用首部来提供信息,有些首部是某种报文专用的,有些首部则更通用一些.本文将详细介绍HTTP报文中的首部 结构 ...

  9. SharePoint 2013 日期和时间字段格式设置

    前言 最近碰到一个需求,用户希望修改日期和时间字段的格式,因为自己的环境是英文的,默认的时间格式是[月/日/年]这样的格式,我也是碰到这个问题才知道,这是美式的时间格式,然而用户希望变成英式的时间格式 ...

随机推荐

  1. C语言-for循环

    for循环是C语言中的循环语句之一,它的一般形式为for(初值,条件表达式,步长){语句};初值通常是一个赋值语句, 它用来给循环控制变量赋初值: 条件表达式是一个关系表达式, 它决定什么时候退出循环 ...

  2. [Angular Tutorial] 9 -Routing & Multiple Views

    在这一步中,您将学到如何创建一个布局模板,并且学习怎样使用一个叫做ngRoute的Angular模块来构建一个具有多重视图的应用. ·当您现在访问/index.html,您将被重定向到/index.h ...

  3. jQuery插件placeholder的使用方法

    借助该插件可以轻松实现HTML5中placeholder特效: 实例代码如下: <script type="text/javascript" src="<%= ...

  4. 获取打开文件的PID

    var SI : TStartupInfo; PI : TProcessInformation; pid:DWORD; begin ZeroMemory(@SI, SizeOf(SI)); //Zer ...

  5. leetcode[149]Max Points on a Line

    Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...

  6. JS 继承(类式 与 原型式)

    1. /* -- 类式继承 -- *///先声明一个超类 function Person(name) { this.name = name;}//给这个超类的原型对象上添加方法 getName Per ...

  7. DELPHI删除记录文件

    http://blog.itpub.net/729024/viewspace-564890/ DBGrid1.SelectedRows.Delete;

  8. #图# #最大生成树# #kruskal# ----- OpenJudge 799:Heavy Transportation

    OpenJudge 799:Heavy Transportation 总时间限制: 3000ms 内存限制: 65536kB 描述BackgroundHugo Heavy is happy. Afte ...

  9. 第一部分 DotNET与C#概述

    DOTNET是.NET Framework框架分为公共语言运行时(CLR)和框架类库(FCL). C#是C#(CSharp)语言(编程语言). 模式: 硬件--->操作系统OS分为非托管应用程序 ...

  10. 如何在Crystal框架项目中内置启动MetaQ服务?

    当Crystal框架项目中需要使用消息机制,而项目规模不大.性能要求不高时,可内置启动MetaQ服务器. 分步指南 项目引入crystal-extend-metaq模块,如下: <depende ...