A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不二晨 金牌黑马   /  2018-11-16 09:38  /  1427 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

概述
PHP中对日期进行处理常用的几个函数如下:
  • date(): 把时间戳格式化为更易读的日期和时间
  • time(): 获取当前 Unix 时间戳
  • strtotime(): 将表示时间和日期的字符串转化为相应的时间戳
  • mktime(): 创建日期
这些函数是PHP核心的部分,无需安装即可使用。另外需要注意的是,这些函数的行为还受到 php.ini 中配置的时区等的影响。
名称描述默认PHP 版本
date.timezone默认时区(所有的 Date/Time 函数使用该选项)""PHP 5.1
date.default_latitude默认纬度(date_sunrise() 和 date_sunset() 使用该选项)"31.7667"PHP 5.0
date.default_longitude默认经度(date_sunrise() 和 date_sunset() 使用该选项)"35.2333"PHP 5.0
date.sunrise_zenith默认日出天顶(date_sunrise() 和 date_sunset() 使用该选项)"90.83"PHP 5.0
date.sunset_zenith默认日落天顶(date_sunrise() 和 date_sunset() 使用该选项)"90.83"PHP 5.0date() 函数详细介绍
data() 函数的语法如下:
string date ( string $format [, int $timestamp ] )
  • format : 必需,规定输出日期字符串的格式
  • timestamp : 可选,规定整数的 Unix 时间戳。默认是当前的本地时间 time()
  • 返回值是格式化后的时间字符串
关于format格式的详细说明如下表:
格式字串可以识别以下 format 参数的字符串format说明返回值例子
------
d月份中的第几天,有前导零的 2 位数字0131
D星期中的第几天,文本表示,3 个字母MonSun
j月份中的第几天,没有前导零131
l(“L”的小写字母)星期几,完整的文本格式SundaySaturday
NISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加)1(表示星期一)到 7(表示星期天)
S每月天数后面的英文后缀,2 个字符stndrd
或者 th。可以和 j 一起用
w星期中的第几天,数字表示0(表示星期天)到 6(表示星期六)
z年份中的第几天0365
星期------
WISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的)例如:42(当年的第 42 周)
------
F月份,完整的文本格式,例如 January 或者 MarchJanuaryDecember
m数字表示的月份,有前导零0112
M三个字母缩写表示的月份JanDec
n数字表示的月份,没有前导零112
t指定的月份有几天2831
------
L是否为闰年如果是闰年为 1,否则为 0
oISO-8601 格式年份数字。这和
Y 的值相同,只除了如果 ISO
的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加)Examples: 1999 or 2003
Y4 位数字完整表示的年份例如:19992003
y2 位数字表示的年份例如:9903
时间------
a小写的上午和下午值ampm
A大写的上午和下午值AMPM
BSwatch 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
完整的日期/时间------
cISO 8601 格式的日期(PHP 5 新加)2004-02-12T15:19:21+00:00
rRFC 822 格式的日期例如:Thu, 21 Dec 2000 16:01:07 +0200
U从 Unix 纪元(January 1 1970 00:00:00 GMT)开始至今的秒数参见 time()<?php// 假定今天是:March 10th, 2001, 5:16:18 pm$today = date("Y-m-d H:i:s");                   // 2001-03-10 17:16:18 (MySQL DATETIME 格式)$today = date("F j, Y, g:i a");                 // March 10, 2001, 5:16 pm$today = date("m.d.y");                         // 03.10.01$today = date("j, n, Y");                       // 10, 3, 2001$today = date("Ymd");                           // 20010310$today = date('h-i-s, j-m-y, it is w Day z ');  // 05-16-17, 10-03-01, 1631 1618 6 Fripm01$today = date('\i\t \i\s \t\h\e jS \d\a\y.');   // It is the 10th day.$today = date("D M j G:i:s T Y");               // Sat Mar 10 15:16:08 MST 2001$today = date('H:m:s \m \i\s\ \m\o\n\t\h');     // 17:03:17 m is month$today = date("H:i:s");                         // 17:16:17date('Y'); // 当前年份date('m'); // 当前月份date('d'); // 当前是几号strtotime() 函数详细介绍
strtotime() 函数语法如下:
int strtotime ( string $time [, int $now = time() ] )
  • time : 日期/时间字符串
  • now : 用来计算返回值的时间戳
  • 本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳,其值相对于 now 参数给出的时间,如果没有提供此参数则用系统当前时间
  • 成功则返回时间戳,否则返回 FALSE,在 PHP 5.1.0 之前本函数在失败时返回 -1
<?phpecho strtotime("now"), "\n";  // 现在时间戳echo strtotime("10 September 2000"), "\n"; // 2000年10月现在时间戳echo strtotime("+1 day"), "\n";  // 距离现在一天后的时间戳echo strtotime("-3 day"), "\n";  // 距离现在三天前的时间戳echo strtotime("+1 week"), "\n"; // 距离现在一周后的时间戳echo strtotime("-1 month"), "\n";// 距离现在一个月前的时间戳echo strtotime("+1 year"), "\n"; // 距离现在一年后的时间戳echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n";  // 距离现在1周2天4小时2秒后的时间戳echo strtotime("next Thursday"), "\n";  // 下个星期三echo strtotime("last Monday"), "\n";    // 本月的最后一个星期一mktime() 函数详细介绍
mktime() 函数语法如下:
int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )
  • 参数可以从右向左省略,任何省略的参数会被设置成本地日期和时间的当前值
  • hour : 小时数
  • minute : 分钟数
  • second : 秒数(一分钟之内)
  • month : 月份数
  • day : 天数
  • year : 年份数
  • is_dst : 本参数可以设为 1,表示正处于夏时制时间(DST),0 表示不是夏时制,或者 -1(默认值)表示不知道是否是夏时制
  • 任何给定月份的最后一天都可以被表示为下个月的第 "0" 天,而不是 -1 天
  • 如果参数非法,本函数返回 FALSE (在 PHP 5.1 之前返回 -1)
<?php$lastday = mktime(0, 0, 0, 3, 0, 2000);echo strftime("Last day in Feb 2000 is: %d", $lastday);$lastday = mktime(0, 0, 0, 4, -31, 2000);echo strftime("Last day in Feb 2000 is: %d", $lastday);?> 其他一些常用函数
time() 获取当前Unix秒数时间戳,还可以使用 microtime() 获取当前 Unix 时间戳和微秒数,这个函数经常用来计算脚本运行的耗时
mixed microtime ([ bool $get_as_float ] )
  • 如果调用时不带可选参数,本函数以 "msec sec" 的格式返回一个字符串,其中 sec 是自 Unix 纪元(0:00:00 January 1, 1970 GMT)起到现在的秒数,msec 是微秒部分。字符串的两部分都是以秒为单位返回的。
  • 如果给出了 get_as_float 参数并且其值等价于 TRUE,microtime() 将返回一个浮点数
  • get_as_float 参数是 PHP 5.0.0 新加的
<?php/** * 兼容php5.0版本以下 */function microtime_float(){    list($usec, $sec) = explode(" ", microtime());    return ((float)$usec + (float)$sec);}$time_start = microtime_float();usleep(100);  // 睡一小会儿$time_end = microtime_float();$time = $time_end - $time_start;echo "耗时: $time 秒\n";?> 时间戳和时间字符串基本函数使用说明
使用 time() 函数,会获取当前时间的 Unix 时间戳,是一个10位的整数,表示自 Unix 纪元(1月1日 1970 00:00:00 GMT)起的当前时间的秒数。
使用 strtotime() 函数,可以将任何英文文本的日期或时间描述解析为 Unix 时间戳。失败则返回 FALSE。应该尽可能使用 YYYY-MM-DD 格式或者使用 date_create_from_format() 函数
使用 date() 函数,可以将时间戳按照指定的格式格式化为时间字符串
基本示例$time = time(); // 当前时间戳var_dump($time);  // int(1516155874)$time_str = date('Y-m-d H:i:s', $time); // 将时间戳转化为相应的时间字符串var_dump($time_str);  // string(19) "2018-01-17 02:24:34"$time_int = strtotime($time_str);  // 将时间字符串转化为时间戳var_dump($time_int); // int(1516155874)常用时间获取
获取那种基于某个时间一定时间段的时间的做法,可以使用 strtotime(),也可以 time() 获取当前时间然后加上或减去指定时间距离现在的偏移秒数。
  • 获取前一天的时间戳:strtotime('-1 day') 或者 time() - 3600 * 24
  • 获取今天凌晨0点的时间戳:strtotime(date("Y-m-d"), time())
  • 获取今天某个时刻如6点半的时间戳: strtotime(data('Y-m-d')) + 6 * 3600 + 30 * 60
数据库查询注意事项
在数据库中保存为 timastamp 或者 datetime 类型的数据,在PHP中查询时,需要使用时间字符串进行查询,而且查询结果也是时间字符串。
另外如果是使用 int 类型保存的时间戳,则要使用时间戳进行查询。查询结果是时间戳。

3 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马