• PHP和MYSQL中的日期和时间


      今天上午同学问了我一个mysql数据库存储时间的问题,就忽然想起要不就总结一下php和mysql中的日期和时间吧。

      我们在一个项目中往往对同一个时间会使用多种方式表达,比如我曾经在mysql数据库中是用int(11)存储unix时间戳,查询出来后再用date()函数进行格式化,或者还有‘Tuesday 18th March 2013’、‘03/18/2013’(美国格式),‘18/03/2013’(欧洲格式),‘20130318’等等。这么多的时间格式我们怎么选择呢,如何显示冲数据库获取的文章列表,并按照日期排序?如果希望呈现更复杂的内容,例如在线日历,应该怎么做?

      不过在此之前我们要说明一下,我们整个地球有很多的时区,不是说我们在哪儿使用服务器,就会显示哪个时区的时间,如果我们不进行设置的话,默认的是0时区的时间,对于我们来说会相差8个小时。不过呢,我们可以使用date_default_timezone_get()获取服务器所在的时区,可以使用date_default_timezone_set(string $timezone_identifier)设置时区,比如date_default_timezone_set("Asia/Shanghai");,那么此时服务器的时区就改成了东八区了。

      关于UNIX时间戳:什么是unix是时间戳,unix时间戳就是从某一个标准时间点(1970/1/1 00:00:00)到某一点所经过的秒数,比如现在(2013/04/11 15:20:47)的时间戳就是1365664847。php中有很多对时间戳进行操作的函数,比如time()、 mktime()、 date()、 strtotime()、 microtime()等等。

      对于time()函数int time ( void ),返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数(unix时间戳)。我们可以看到,time()函数没有参数,返回的就是当前时间的unix是时间戳。

      mktime():int mktime(int $hour, int $minute, int $second, int $month, int $day, int $year),返回unix时间戳。对于传入的参数,可以从右往左依次省略,如果省略的话,默认的是当前时间的某个值,比如省略了$year则默认是2013。

      date():string date(string format, int timestamp),返回将整数timestamp用format格式化后的时间格式,timestamp可以省略,若省略则默认是当前的时间戳(time())。

      strtotime():这个函数的功能很强大,通过例子我们就能理解了。

      microtime():返回当前时间的unix时间戳和微秒数。

      让我们尝试一下上面的几个函数,看看都能输出些什么。

     1 //date_default_timezone_set("Asia/Shanghai");
     2 echo 'date_default_timezone:'.date_default_timezone_get().'<br/>';
     3 
     4 
     5 echo 'time():'.time().'<br/>';
     6 
     7 echo 'date("Y/m/d H:i:s"):'.date('Y/m/d H:i:s').'<br/>';
     8 echo 'date("Y/m/d H:i:s", 1365665148)'.date("Y/m/d H:i:s", 1365665148).'<br/>';
     9 
    10 echo 'microtime():'.microtime().'<br/>';
    11 echo 'microtime(true):'.microtime(true).'<br/>';
    12 
    13 echo 'mktime(14, 43, 0, 4, 11, 2013):'.mktime(14, 43, 0, 4, 11, 2013).'<br/>';
    14 echo 'mktime(14, 43, 0, 4):'.mktime(14, 43, 0, 4).'<br/>';
    15 
    16 echo 'strtotime("April 11th 2013 14:43:00"):'.strtotime('April 11th 2013 14:43:00').'<br/>';
    17 echo 'strtotime("April"):'.strtotime('April').'<br/>';
    18 echo 'strtotime("+1 day"):'.date("Y/m/d l H:i:s", strtotime('+1 day')).'<br/>';
    19 echo 'strtotime("-1 month"):'.date("Y/m/d l H:i:s", strtotime('-1 month')).'<br/>';
    20 echo 'strtotime("-2 year"):'.date("Y/m/d l H:i:s", strtotime('-2 year')).'<br/>';
    21 echo 'strtotime("next friday"):'.date("Y/m/d l H:i:s", strtotime('next friday')).'<br/>';
    22 echo 'strtotime("last saturday"):'.date("Y/m/d l H:i:s", strtotime('last saturday')).'<br/>';

      是不是发现strtotime很强大啊,他能将一些可以判定的时间字符串转换为时间戳。

      有没有一种想要做一个简单的日历的冲动呢?让我们来试试吧。我们就做下面的这种效果。

      

      首先我们的准备工作有:

      (1)一个月的第一天(1号)的时间戳,这个时间戳的作用是获取该月的上一个月、下一个月和上一年、下一年的时间节点;

      (2)为了展示一个月的完整的日历,我们需要:1号距离星期日前面有几个空白天(假如星期日是一个月的第一天),该月一共有多少天,该月最后剩余的空白。如果你还想弄一个回到今天的链接,那么我还需要获取今天的日期;

      (3)我们链接的跳转可以设置为向url传递参数,然后页面根据获取的参数展示相应的月历;

      (4)上一年的链接制作:上一年的年份和现在的月份;下一年的链接制作:下一年的年份和现在的月份;

      (5)上一个月的链接制作:上一个月所在的年份和上一个月的月份;下一个月的链接制作:下一个月所在的年份和下一个月的月份。为什么不能直接用现在的年份呢?你懂得。

      (6)按照格式填入到表格中,然后输出。

      (7)完成。

      我们来一步步的写,定义一个数组$calender_data来存储数组中所有的数据,包括空的格子。

      获取当月的第一天的时间戳,同时生成上一月、下一月、上一年和下一年的时间戳:

     1 $g = $_REQUEST;
     2 $year  = isset($g['year'])?$g['year']:date("Y");    //获取$year
     3 $month = isset($g['month'])?$g['month']:date("F");    //获取$month
     4 $start_day  = strtotime("{$month} 1 {$year}");        //$year $month的第一天的时间戳
     5 $day_num    = date('t', $start_day);                //一个月的天数
     6 $date_range = range(1, $day_num);                    //
     7 $pre_month  = strtotime("-1 month", $start_day);    //上一月的第一天的时间戳
     8 $next_month = strtotime("+1 month", $start_day);    //下一个月的第一天的时间戳
     9 $pre_year   = strtotime("-1 year", $start_day);        //
    10 $next_year  = strtotime("+1 year", $start_day);

      range() 函数创建并返回一个包含指定范围的元素的数组。

      生成上一月、下一月、上一年和下一年的链接:

     1 define(EMP, ' ');
     2 $html = "<a href='{$_SERVER['SCRIPT_NAME']}?year=%s&month=%s'>%s</a>";
     3 $calender_data = array();
     4 $calender_data[] = sprintf($html, date('Y', $pre_month), $month, date('Y', $pre_year));
     5 $calender_data[] = EMP;
     6 $calender_data[] = EMP;
     7 $calender_data[] = $year;
     8 $calender_data[] = EMP;
     9 $calender_data[] = EMP;
    10 $calender_data[] = sprintf($html, date('Y', $next_year), $month, date('Y', $next_year));
    11 
    12 $calender_data[] = sprintf($html, date('Y', $pre_month), date('F', $pre_month), date('M', $pre_month));
    13 $calender_data[] = EMP;
    14 $calender_data[] = EMP;
    15 $calender_data[] = $month;
    16 $calender_data[] = EMP;
    17 $calender_data[] = EMP;
    18 $calender_data[] = sprintf($html, date('Y', $next_month), date('F', $next_month), date('M', $next_month));

      生成一周的星期简称:

    1 $calender_data[] = 'Sun';
    2 $calender_data[] = 'Mon';
    3 $calender_data[] = 'Tue';
    4 $calender_data[] = 'Wed';
    5 $calender_data[] = 'Thu';
    6 $calender_data[] = 'Fri';
    7 $calender_data[] = 'Sat';

      将一个月前面的空格,天和最后的空格追加到数组中:

     1 $start_blank = date('N', $start_day)%7;
     2 for($i=0; $i<$start_blank; $i++){
     3     $calender_data[] = EMP;
     4 }
     5 foreach($date_range as $v){
     6     $calender_data[] = $v;
     7 }
     8 $end_blank = (7-($day_num+$start_blank)%7)%7;
     9 for($i=0; $i<$end_blank; $i++){
    10     $calender_data[] = EMP;
    11 }

      将数组填充到表格中:

    1 $h = '<table border="1px" cellspacing="0px" style="border-collapse:collapse; 600px; margin-top:10px;"><tr>';
    2 for($i=0, $t=count($calender_data); $i<$t; $i++){
    3     $h .= "<td>{$calender_data[$i]}</td>";
    4     if(($i+1)%7==0){
    5         $h .= "</tr></tr>";
    6     }
    7 }
    8 $h .= '</table>';
    9 echo $h;

      好的,此时整个日历就完成了。

  • 相关阅读:
    Java静态类
    【Java TCP/IP Socket】深入剖析socket——TCP套接字的生命周期
    【Java TCP/IP Socket】深入剖析socket——TCP通信中由于底层队列填满而造成的死锁问题(含代码)
    【Java TCP/IP Socket】深入剖析socket——数据传输的底层实现
    【Java TCP/IP Socket】基于NIO的TCP通信(含代码)
    【Java TCP/IP Socket】Java NIO Socket VS 标准IO Socket
    【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)
    数据结构课后练习题(练习三)7-5 Tree Traversals Again (25 分)
    快速排序详解(lomuto划分快排,hoare划分快排,classic经典快排,dualpivot双轴快排源码)
    Java多线程(一)——线程基础和锁锁锁
  • 原文地址:https://www.cnblogs.com/xumengxuan/p/3015040.html
Copyright © 2020-2023  润新知