Practical PHP Programming

转换为字符串

string date ( string format [, int timestamp])

不管Unix时间戳在编程时使用起来如何方便,它对最终用户来说都是不友好的,毕竟没有人会用秒数来表示时间。

人们都喜欢用各种格式化之后的日期格式来表示时间,因此,我们可以通过date()函数来讲时间戳转换为我们想要的格式。

date()函数有两个参数:第一个是参数包含你想要转换成某种格式的字符串,第二个参数是你想要转换的时间戳。如果你不提供第二个参数的话,PHP假定你想使用当前时间。

date()的第一个参数很关键,是由一系列预定义的选项组成的字符串。你可以在字符串中庸其他字符,这些字符将被直接复制到格式化的日期中。如果你用到某个预定义的字符而不需要其作为日期选项时,你需要用\将其进行转义。如果你要用的转义字符已经存在一个转义序列当中,你需要将其再次转义。听起来可能很别扭,别担心,我们稍后讲几个例子。

下面是全部的日期格式字符串,注意他们是大小写敏感的。

格式化字符 描述 例子
a 小写的 am/pm am 或 pm
A 大写的 am/pm AM 或 PM
B Swatch Internet Time 000 到 999
c ISO 8601 日期, 时间, and 时区 2004-06-18T09:26:55+01:00
d 0开头的两位的月份 01 to 31
D 三个字母的星期字符串 Mon, Thu, Sat
F 英文月份 January, August
g 12小时制,不补零 1 to 12
G 24小时制,不补零 0 to 23
h 12小时制,补零 01 to 12
H 24小时制,补零 00 to 23
i 补零的分钟数 00 to 59
I 是否采用夏时制? 1 if yes, 0 if no
j 不补零的日期 1 to 31
l 星期几全拼 Monday, Saturday
L 是闰年吗? 1 if yes, 0 if no
m 补零的月份 01 to 12
M 短字符串型月份 Jan, Aug
n 不补零的月份 1 to 12
O 与GMT的时间差 200
r RFC-822 格式的日期 Sat, 22 Dec 1979 17:30 +0000
s 补零的秒数 00 to 59
S 英文序数词后缀 st, nd, rd, or th
t 月份中的日期 28 to 31
T 服务器时区 GMT, CET, EST
U Unix 时间戳 1056150334
w 周几的数字格式 0 (Sunday), 6 (Saturday)
W ISO-8601 阴暗中的第几周 30 (30th week of the year)
y 两位数表示的年份 97, 02
Y 四位数表示的年份 1997, 2002
z 一年中的第几天 0 to 366
Z 以秒计数的时间偏移 -43200 to 43200

从上表中可以看出,从时间戳转换为日期有太多选择。下面是一个使用格式化字符的例子:

<?php
    print date("H:i") . "\n";
    print "The day yesterday was " . date("l", time() - 86400) . "\n";
    print "The year is " . date("Y") . "\n";
    print date("jS of F Y") . "\n";
    print "My birthday is on a " . date("l", strtotime("22 Dec 2004")) . " this year.\n";
    print date("\M\y b\i\\r\\t\h\d\a\y \i\s o\\n \a l \\t\h\i\s \ye\a\\r. ", strtotime("22 Dec 2004")) . "\n";
?>
  • 第一行最基础,以24小时制输出当前时间。
  • 第二行稍微有点复杂,输出昨天星期几。
  • 第三行也很简单,仅仅输出了当前的年份。
  • 第四行就有点复杂了,输出的是22nd of October 2003格式的日期。注意其中的of这个单词,直接按照输入的样子被输出出来,没有经过任何转换。这是因为小写的o和小写的f没有对应的日期格式(将来可能出现),所以直接按照原样输出了。
  • 第五行中,我们的日期函数被夹在另外两个字符串当中,这样就形成了一种很好看的输出格式。可以在日期格式里面加入字符串,但最终也是输出像第五行这样的东西。
  • 第六行中,你可以看到原本在日期函数外面的字符串被移到了函数的日期格式字符串中。因为大部分的日期格式字符串都有对应的日期格式,因此不得不进行转义。小写的b、o、e没有对应的日期格式,因此无需转义。小写的r、t、n因为本身作为转义字符串有其各自的含义(换行,Tab,回车),因此需要被再次转义,这也就是为什么这三个前面是\\而不是\的原因了。两个\,一个用来阻止PHP将其替换为日期格式,另一个用来阻止PHP将其作为转义符输出。

利用日期函数可以做很多事,所以我强烈推荐你尝试一下不同的格式,看看你能形成怎样不同的组合。