PHP学习笔记
2009-8-15_1
主题:格式化日期产生函数generateDateWeekTime
1 要点
1.1 格式化输出日期
虽然可以直接用PHP函数date(),但我想要的输出格式是:年-月-日(星期)上/下午 时:分,而date()函数的星期和上/下午都是英文,所以还是自己写个函数加工一下吧。
1.2 有用的时间函数:time()、date()、mktime()
1.2.1 函数time(),PHP手册对该函数的描述如下
time — 返回当前的 Unix 时间戳
说明
int time ( void )
返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间的秒数。
PS:MySQL中INT类型的有效范围
我存入数据库的也是time()的返回值,因为是秒数,我还曾担心MySQL的INT类型是否存的下。“2009年8月15日(星期6)下午 5:34”的秒数是“1250328876”,10位数,INT类型的有效范围是
-2147483648到2147483647(signed),10位数
0到4294967295 (unsigned),10位数
这样看来,存成unsigned肯定是够了。
另外,根据MySQL5.1英文手册的说法,“int(10)”括号中的10指的是10进制位数,我在phpMyAdmin中试了一下,signed(默认情况)是“int(11)”,而unsigned则是“int(10)”,多出的那1位是留给“-”负号的。
1.2.2 函数date(),PHP手册对该函数的描述如下
date — 格式化一个本地时间/日期
说明
string date ( string $format [, int $timestamp] )
返回将整数 timestamp 按照给定的格式字串而产生的字符串。如果没有给出时间戳则使用本地当前时间。换句话说,timestamp 是可选的,默认值为 time()。
注意: 有效的时间戳典型范围是格林威治时间 1901 年 12 月 13 日 20:45:54 到 2038 年 1 月 19 日 03:14:07。(此范围符合 32 位有符号整数的最小值和最大值)。不过在 PHP 5.1 之前此范围在某些系统(如 Windows)中限制为从 1970 年 1 月 1 日到 2038 年 1 月 19 日。
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 |
P | 与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) | 例如:+02:00 |
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() |
格式字串中不能被识别的字符将原样显示。Z 格式在使用 gmdate() 时总是返回 0。
1.2.3 函数mktime(),PHP手册对该函数的描述如下
mktime — 取得一个日期的 Unix 时间戳
说明
int mktime ( [int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year [, int $is_dst]]]]]]] )
根据给出的参数返回 Unix 时间戳。时间戳是一个长整数,包含了从 Unix 纪元(January 1 1970 00:00:00 GMT)到给定时间的秒数。
参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值。
比如date("Y-n-j H:i:s", mktime(0, 0, 0, 1, 1, 1998))将返回1998-1-1 00:00:00。
2 总结
原先我往数据库中存入的是date()函数的返回值,这样从数据库中读取字符串出来后想要转换为秒数还得调用函数strtotime(),但是这个函数只能预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳,我感觉有些不方便,干脆就往数据库里存入秒数,反正也存的下。
3 源代码
关于源代码的效果举个例子:
generateDateWeekTime(time())将返回“2009年8月15日(星期六)下午6:15”。
//格式化日期产生函数generateDateWeekTime
/*
参数说明:
$timeStamp表示要格式化输出的时间戳,可以使用time()函数,或者使用mktime()生成的时间
需要注意的是这两个函数返回的是自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前(time()函数)或指定(mktime()函数)时间的秒数
返回值说明:
返回格式化后的时间字符串,格式为:
年-月-日(星期)上/下午 时:分
其中:
1 年为4位数字完整表示的年份
2 月为数字表示的月份且没有前导零
3 日为月份中的第几天且是没有前导零的1到2位数字
4 小时为12小时格式,且没有前导零
5 分为有前导零的2位数字
*/
function generateDateWeekTime($timeStamp)
{
//产生日期
$date = date("Y年n月j日", $timeStamp);
//产生星期
$week = date("N", $timeStamp);
switch($week)
{
case "1":
{
$week = "(星期一)";
break;
}
case "2":
{
$week = "(星期二)";
break;
}
case "3":
{
$week = "(星期三)";
break;
}
case "4":
{
$week = "(星期四)";
break;
}
case "5":
{
$week = "(星期五)";
break;
}
case "6":
{
$week = "(星期六)";
break;
}
case "7":
{
$week = "(星期天)";
break;
}
default :
{
$week = "(星期?)";
break;
}
}
//产生时间
$time = date("a", $timeStamp);//判断是上午还是下午
switch($time)
{
case "am":
{
$time = "上午";
break;
}
case "pm":
{
$time = "下午";
break;
}
default :
{
$time = "?";
break;
}
}
$time = $time.date("g:i", $timeStamp);//产生小时和分钟
$dateWeekTime = $date.$week.$time;//将日期、星期、时间合起来
return $dateWeekTime;
}