Rumah >php教程 >php手册 >PHP和MYSQL中的日期和时间

PHP和MYSQL中的日期和时间

WBOY
WBOYasal
2016-06-06 19:53:281137semak imbas

今天上午同学问了我一个mysql数据库存储时间的问题,就忽然想起要不就总结一下php和mysql中的日期和时间吧。 我们在一个项目中往往对同一个时间会使用多种方式表达,比如我曾经在mysql数据库中是用int(11)存储unix时间戳,查询出来后再用date()函数进行格式

  今天上午同学问了我一个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时间戳和微秒数。

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

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

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

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

  PHP和MYSQL中的日期和时间

  首先我们的准备工作有:

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

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

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

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

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

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

  (7)完成。

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

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

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

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

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

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

  生成一周的星期简称:

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

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

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

  将数组填充到表格中:

<span>1</span> <span>$h</span> = '
'; 2for($i=0, $t=count($calender_data); $i$t; $i++){ 3$h .= ""; 4if(($i+1)%7==0){ 5$h .= ""; 6 } 7} 8$h .= '
{$calender_data[$i]}
'; 9 echo $h;

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

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:PHP框架:climbPHP 首发Artikel seterusnya:PHP调用SQL Server存储过程