首页 > 代码库 > PHP 时间与日期

PHP 时间与日期

      PHP提供了大量的内置函数,使开发者在时间的处理上游刃有余,大大提高了工作效率。

介绍一些常见的PHP日期和时间函数以及日期和时间的处理。


经常使用的日期和时间处理函数

函 数

说  明

checkdate

验证时间函数。推断时间是否有效,有效返回true,否则返回false

date_default_timezone_get

取得脚本日期时间函数所使用的默认时区

date_default_timezone_set

设定日期时间函数的默认时区

date

格式化一个本地时间/日期

getdate

获取日期/时间信息

gettimeofday

获取当前时间

localtime

获取本地时间

microtime

返回当前时间戳和微秒数

mktime

取得一个UNIX时间戳

strtotime

将不论什么英文文本的日期时间描写叙述解析为UNIX时间戳

time

返回当前的UNIX时间戳


系统时区设置

      在学习过程中发现通过date()函数获取到的时间跟本地时间不一样,这是因为PHP5对date()函数进行了重写,因此,眼下的日期时间函数比系统时间少8个小时。

在PHP语言中默认设置的是标准的格林威治时间(即採用的是零时区)。更改PHP语言中的时区设置主要有下面两种方法:
      1. 改动php.ini文件里的设置,找到[date]下的;date.timezone = 选项,将该项改动为date.timezone=Asia/Hong_Kong,然后又一次启动apacheserver。
      2. 在应用程序中,使用时间日期函数之前加入例如以下函数:
      date_default_timezone_set(“Asia/Hong_Kong”);设置完毕后,date()函数就能够正常使用了,不会再出现时差问题。



UNIX时间戳

      时间戳是文件属性中的创建、改动、訪问时间。数字时间戳服务(digital time stamp service, DTS)是web站点安全服务项目之中的一个,能提供电子文件的日期和时间信息的安全保护。

      时间戳是一个经加密后形成后的凭证文档。它包含3个部分:
      2  须要加入时间戳的文件用Hash编码加密形成摘要。
      2  DTS接受文件的日期和时间信息。
      2  对接受的DTS文件加密。
      数字时间是由认证单位DTS来加入的。以DTS接收到文件的时间为根据。时间戳的作用原理是通过其它加密法将时间的数值转换为加密的数值,时间变化后加密的数值也随之变化。

时间戳的长处是:变化的加密数值来防止数值被窃取后非法反复利用,也就起到了加密的作用。时间戳主要依赖于时间,在约定的一段时间内产生唯一的一个数值。



mktime()函数

      语法:
      int mktime(int hour, int minute, int month, int day, int year, int [is_dst])

參  数

说  明

hour

小时数

minute

分钟数

second

秒数(一分钟之内)

month

月份数

day

天数

year

年份数

is_dst

參数is_dst在夏令时能够被设置为1。假设不是则设置为0;假设不确定是否为夏令时则设置为-1(默认值)

      注意:有效的时间戳典型范围是格林尼治时间1901年12月13日20:45:54~2038年1月19日03:13:07(此范围符合32位有符号整数的最小值和最大值)。在Windows系统中此范围限制为从1970年1月1日~2038年1月19日。


date()函数

      date(string format,int timestamp)
      该函数将返回參数timestamp依照指定格式而产生的字符串。当中參数timestamp是可选的,假设省略,则使用当前时间。

format參数能够使开发者按其指定的格式输出时间日期。
      date_default_timezone_set(PRC);  //设置北京时间.

format 字符 说明 返回值样例
--- ---
d 月份中的第几天,有前导零的 2 位数字 0131
D 星期中的第几天,文本表示,3 个字母 MonSun
j 月份中的第几天。没有前导零 131
l("L"的小写字母) 星期几,完整的文本格式 SundaySaturday
N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
S 每月天数后面的英文后缀,2 个字符 stndrd 或者 th。能够和 j 一起用
w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
z 年份中的第几天 0365
星期 --- ---
W ISO-8601 格式年份中的第几周,每周从星期一開始(PHP 4.1.0 新加的) 比如:42(当年的第 42 周)
--- ---
F 月份。完整的文本格式,比如 January 或者 March JanuaryDecember
m 数字表示的月份,有前导零 0112
M 三个字母缩写表示的月份 JanDec
n 数字表示的月份。没有前导零 112
t 给定月份所应有的天数 2831
--- ---
L 是否为闰年 假设是闰年为 1,否则为 0
o ISO-8601 格式年份数字。这和 Y 的值同样。仅仅除了假设 ISO 的星期数(W)属于前一年或下一年,则用那一年。

(PHP 5.1.0 新加)

Examples: 1999 or 2003
Y 4 位数字完整表示的年份 比如:19992003
y 2 位数字表示的年份 比如:9903
时间 --- ---
a 小写的上午和下午值 ampm
A 大写的上午和下午值 AMPM
B Swatch Internet 标准时 000999
g 小时,12 小时格式,没有前导零 112
G 小时。24 小时格式。没有前导零 023
h 小时,12 小时格式,有前导零 0112
H 小时,24 小时格式,有前导零 0023
i 有前导零的分钟数 0059>
s 秒数。有前导零 0059>
u 毫秒 (PHP 5.2.2 新加)。须要注意的是 date() 函数总是返回 000000 由于它仅仅接受 integer 參数。 而 DateTime::format() 才支持毫秒。

演示样例: 654321
时区 --- ---
e 时区标识(PHP 5.1.0 新加) 比如:UTCGMTAtlantic/Azores
I 是否为夏令时 假设是夏令时为 1,否则为 0
O 与格林威治时间相差的小时数 比如:+0200
P 与格林威治时间(GMT)的区别。小时和分钟之间有冒号分隔(PHP 5.1.3 新加) 比如:+02:00
T 本机所在的时区 比如:ESTMDT(【译者注】在 Windows 下为完整文本格式,比如"Eastern Standard Time",中文版会显示"中国标准时间")。
Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -4320043200
完整的日期/时间 --- ---
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 比如:Thu, 21 Dec 2000 16:01:07 +0200
U 从 Unix 纪元(January 1 1970 00:00:00 GMT)開始至今的秒数 參见 time()

getdate()函数

      该函数返回数组形式的日期时间信息,假设没有时间戳,则以当前时间为准。


元  素

说  明

seconds

秒。返回值0~59

minutes

分钟,返回值为0~59

hours

小时。返回值为0~23

mday

月份中第几天。返回值为1~31

wday

星期中第几天,返回值为0(星期天)~6(星期六)

mon

月份数字,返回值为1~12

year

4位数字表示的完整年份,返回值加2000或2008

yday

一年中第几天,返回值0~365

weekday

星期几的完整文本表示,返回值为Sunday~Saturday

month

月份的完整文本表示。返回值为January~December

0

返回从UNIX纪元開始的秒数


比較两个时间的大小

      在实际开发中经常遇到推断两个时间的大小,PHP中的时间是不能够直接来进行比較的。所以,首先要将时间输出为时间戳的格式。然后再进行比較,这是经常使用到的方法。


      有两个函数都能够实现这个功能,这里使用strtotime()函数,该函数能够将不论什么英文文本的日期时间描写叙述解析为UNIX时间戳。       该函数的语法为:
      int strtotime(string time, int now)
      该函数有两个參数。假设參数time的格式是绝对时间。则now參数不起作用;假设參数time的格式是相对时间。那么其相应的时间就是參数now来提供的,假设没有提供參数now,相应的时间就是当前时间。

假设解析失败。则返回-1.


计算页面脚本的执行时间

      在浏览站点时,常常会用到搜索引擎。在搜索信息时。细心的用户会发现。在搜索结果的最下方,一般都有“搜索时间为……秒”的字样。这里使用到了microtime()函数,该函数返回当前UNIX时间戳和微秒数。返回格式为msec sec的字符串,当中sec是当前的UNIX时间戳,msec为微秒数。

该函数的格式为:
      string microtime(void)

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head>

<body>
<?php
    // 设置时区
    date_default_timezone_set(‘Asia/Chongqing‘);
    
    // 指定时间到UNIX纪元的差值
    echo mktime(1, 2, 3, 4, 5, 2006)."<br>";
    
    // 当前时间到UNIX纪元的差值
    echo time()."<br>";
    
    // 格式化时间
    echo date("Y-m-d H-i-s")."<br>";
    
    // 时间数组
    $arrays = getdate();
    print_r($arrays)."<br>";
    
    // 检測时间
    var_dump( checkdate(7, 9, 2015) );
    
    "<br>";
    
    // 本地化时间戳,strtotime还可用于时间的大小比較
    setlocale(LC_TIME, 0);
    echo strftime(‘%Y,%m,%d‘, strtotime(‘2000-04-00‘))."<br>";
    
    // 微妙
    echo microtime(true);    
    
    function run_time()
    {
        list($msec, $sec) = explode(" ", microtime());
        return ((float)$msec + (float)$sec);
    }
    
    $start_time = run_time();
    $time1 = strtotime(date( "Y-m-d H:i:s"));
    $time2 = strtotime("2008-2-3 17:10:00");
    $time3 = strtotime("2008-8-8");
    $sub1 = ceil(($time2 - $time1) / 3600);          //60 * 60
    $sub2 = ceil(($time3 - $time1) / 86400);         //60 * 60 * 24
    echo "离放假还有<font color=red> $sub1 </font>小时!!!" ; 
    echo "<p>";
    echo "离北京奥运开幕还有<font color=red>$sub2 </font>天!!!";
    $end_time = run_time();
    echo ‘耗时‘.($end_time - $start_time);    
?>
</body>
</html>
技术分享

PHP 时间与日期