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

PHP和MYSQL中的日期和时间

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-06 19:53:28
Original
1159 Leute haben es durchsucht

今天上午同学问了我一个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>';
Nach dem Login kopieren

  是不是发现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>);
Nach dem Login kopieren

  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>));
Nach dem Login kopieren

  生成一周的星期简称:

<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';
Nach dem Login kopieren

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

<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> }
Nach dem Login kopieren

  将数组填充到表格中:

<span>1</span> <span>$h</span> = '
Nach dem Login kopieren
'; 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;

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

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Aktuelle Ausgaben
PHP-Datenerfassung?
Aus 1970-01-01 08:00:00
0
0
0
PHP-Erweiterung intl
Aus 1970-01-01 08:00:00
0
0
0
Wie man PHP gut lernt
Aus 1970-01-01 08:00:00
0
0
0
Mehrere PHP-Versionen
Aus 1970-01-01 08:00:00
0
0
0
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage