PHP 日期与时间

1 PHP的日期和时间库
PHP默认依赖于操作系统的时区设置,从PHP5.1.0起可以通过php.ini文件的data.timezone配置指令来改变网站的时区,也可以使用date_default_timezone_set()函数,否则可能生成各级别的错误。

1.1 验证日期
boolean checkdate(int month, int day, int year) 函数能够验证日期。如果提供的日期有效,返回TRUE,否则返回FALSE。

1.2 格式化日期和时间
string date(string format [, int timestamp]) 函数返回根据预定义格式指定的指令格式化当前时间和日期的字符串形式。

date()函数的格式参数

format 字符 说明 返回值例子
日 — —
d 月份中的第几天,有前导零的 2 位数字 01 到 31
D 星期中的第几天,文本表示,3 个字母 Mon 到 Sun
j 月份中的第几天,没有前导零 1 到 31
l(“L”的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday
N ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)
S 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用
w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)
z 年份中的第几天 0 到 366
星期 — —
W ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的) 例如:42(当年的第 42 周)
月 — —
F 月份,完整的文本格式,例如 January 或者 March January 到 December
m 数字表示的月份,有前导零 01 到 12
M 三个字母缩写表示的月份 Jan 到 Dec
n 数字表示的月份,没有前导零 1 到 12
t 给定月份所应有的天数 28 到 31
年 — —
L 是否为闰年 如果是闰年为 1,否则为 0
o ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003
Y 4 位数字完整表示的年份 例如:1999 或 2003
y 2 位数字表示的年份 例如:99 或 03
时间 — —
a 小写的上午和下午值 am 或 pm
A 大写的上午和下午值 AM 或 PM
B Swatch Internet 标准时 000 到 999
g 小时,12 小时格式,没有前导零 1 到 12
G 小时,24 小时格式,没有前导零 0 到 23
h 小时,12 小时格式,有前导零 01 到 12
H 小时,24 小时格式,有前导零 00 到 23
i 有前导零的分钟数 00 到 59>
s 秒数,有前导零 00 到 59>
时区 — —
e 时区标识(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores
I 是否为夏令时 如果是夏令时为 1,否则为 0
O 与格林威治时间相差的小时数 例如:+0200
T 本机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)。
Z 时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -43200 到 43200
完整的日期/时间 — —
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()
1.3 将时间戳转换为用户友好的值
array getdate([int timestamp])函数接受一个时间戳,并返回一个由其各部分组成的关联数组。如果不给出时间戳,则此函数返回的各个部分基于当前日期和时间。
一共11个数组元素:

hours 小时
mday 月份中某日
minutes 分钟
mon 月份
moth 月份文本表示
seconds 秒
wday 一周中某日
weekday 一周中某日文本表示

yday 一年中某日的数值偏移
year 年份的四位数值表示
0 从UNIX纪元开始的秒数

print_r(getday(time()));
Array
(
[seconds] => 59
[minutes] => 6
[hours] => 18
[mday] => 8
[wday] => 6
[mon] => 9
[year] => 2012
[yday] => 251
[weekday] => Saturday
[month] => September
[0] => 1347098819
)
1.4 处理时间戳
1) 确定当前时间戳
int time() 函数获取当前时刻的UNIX时间戳。可以把时间戳转换为可读日期:
echo date(“d-m-Y h:i:s”, time())

2) 根据特定的日期和时间创建时间戳
int mktime([int hour [, int minute [, int second [, int month [, int day [, int year]]]]]]) 函数用于生成给定日期和时间的时间戳。如未给出日期和时间,则返回当前日期和时间的时间戳。

2 日期函数
2.1 显示本地化的日期和时间
1) 设置默认的本地化环境
string setlocale(interger category, string locale [, string locale …])
string setlocale(interger category, array locale)
setlocale()函数通过赋新值来改变PHP的默认本地化环境。

正式的本地化字符串遵循如下结构:
language_COUNTRY.characterset
如意大利本地化环境它的本地化字符串应当设置为it_IT.utf8,英国为en_GB.utf8,美国为en_US.utf8

在类UNIX的系统中,可以运行locale –a来确定所支持的本地化环境。

[root@localhost ~]# locale -a | grep zh
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.big5hkscs
zh_HK.utf8
zh_SG
zh_SG.gb2312
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.big5
zh_TW.euctw
zh_TW.utf8
setlocale()函数的第一个参数是catalog,需要制定本地化的分类,一共有6种:

LC_ALL 为以下所有5类设置本地化规则
LC_COLLATE 字符串比较。
LC_CTYPE 字符分类和转换。
LC_MONETARY 货币形式。
LC_NUMERIC 数值形式。
LC_TIME 日期和时间形式。
例子,确保根据意大利本地化环境完成格式化:
setlocale(LC_TIME, “it_IT.utf8”);
echo strftime(“%A, %d %B, %Y”);

2) 本地化日期和时间
string strftime(string format [, int timestamp])函数根据setlocale()指定的本地化设置来格式化日期和时间。

式字串能识别下列转换标记:

%a - 当前区域星期几的简写
%A - 当前区域星期几的全称
%b - 当前区域月份的简写
%B - 当前区域月份的全称
%c - 当前区域首选的日期时间表达
%C - 世纪值(年份除以 100 后取整,范围从 00 到 99)
%d - 月份中的第几天,十进制数字(范围从 01 到 31)
%D - 和 %m/%d/%y 一样
%e - 月份中的第几天,十进制数字,一位的数字前会加上一个空格(范围从 ‘ 1’ 到 ‘31’)
%g - 和 %G 一样,但是没有世纪
%G - 4 位数的年份,符合 ISO 星期数(参见 %V)。和 %V 的格式和值一样,只除了如果 ISO 星期数属于前一年或者后一年,则使用那一年。
%h - 和 %b 一样
%H - 24 小时制的十进制小时数(范围从 00 到 23)
%I - 12 小时制的十进制小时数(范围从 00 到 12)
%j - 年份中的第几天,十进制数(范围从 001 到 366)
%m - 十进制月份(范围从 01 到 12)
%M - 十进制分钟数
%n - 换行符
%p - 根据给定的时间值为 am' 或pm’,或者当前区域设置中的相应字符串
%r - 用 a.m. 和 p.m. 符号的时间
%R - 24 小时符号的时间
%S - 十进制秒数
%t - 制表符
%T - 当前时间,和 %H:%M:%S 一样
%u - 星期几的十进制数表达 [1,7],1 表示星期一
%U - 本年的第几周,从第一周的第一个星期天作为第一天开始
%V - 本年第几周的 ISO 8601:1988 格式,范围从 01 到 53,第 1 周是本年第一个至少还有 4 天的星期,星期一作为每周的第一天。(用 %G 或者 %g 作为指定时间戳相应周数的年份组成。)
%W - 本年的第几周数,从第一周的第一个星期一作为第一天开始
%w - 星期中的第几天,星期天为 0
%x - 当前区域首选的时间表示法,不包括时间
%X - 当前区域首选的时间表示法,不包括日期
%y - 没有世纪数的十进制年份(范围从 00 到 99)
%Y - 包括世纪数的十进制年份
%Z 或 %z - 时区名或缩写
%% - 文字上的 `%’ 字符
2.2 显示网页的最新修改日期
int getlastmod()函数返回该页面的Last-Modified首部(是一个时间戳)。

$lastmod = date(“F d, Y h:i:sa”, getlastmod());
echo “Page last modified on $lastmod”;
2.3 确定当前月份中的天数
为确定当前月份中的天数,可以使用date()的t参数。

2.4 确定任意给定月份的天数

$lastday = mktime(0, 0, 0, 2, 1, 2010);
printf(“There are %d days in February 2010.”, date(“t”, $lastday));
2.5 计算当前日期后X天的日期

$futuredate = strtotime(“+45 days”);
$pastdate = strtotime(“-45 days”);
$futuredate = strtotime(“10 weeks 2 days”);
3 为PHP5.1+用户提供的日期时间改进
3.1 DateTime构造函数

object DateTime([string time [, DateTimeZone timezone]])
$date = new DateTime(); //设置空对象
$date = new DateTime(“25 May 2010”); //设置日期
$date = new DateTime(“25 May 2010 21:55”); //设置时间
在这个构造函数中,可以使用strtotime()函数支持的任何格式。

3.2 格式化日期
echo $date->format(“Y-m-d h:i:sa”); 与date()函数的参数相同

3.3 实例化后设置日期
boolean setDate(integer year, integer month, interger day);
$date = new DateTime();
$date->setDate(2010,5,25);
echo $date->format(“F j, Y”);

3.4 实例化后设置时间
boolean setTime(integer hour, integer minute, [, integer second])

3.5 修改日期和时间
$date = new DateTime(“May 25, 2010 00:33”);
$date->modify(“+27 hours”);

3.6 计算两个日期只差
$erminationDate = new DateTime(‘2010-05-30’);
$todaysDate = new DateTime(‘today’);
$span = $erminationDate->diff($todaysDate);

diff()这个方法需要PHP5.3.0以后的版本才能使用。

坚持原创技术分享,您的支持将鼓励我继续创作!