• 认真地记录技术中遇到的坑!

PHP日期时间处理

PHP 悠悠 2年前 (2018-01-17) 1437次浏览 1个评论

概述

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.0

date() 函数详细介绍

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
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()
<?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:17

date('Y'); // 当前年份
date('m'); // 当前月份
date('d'); // 当前是几号

strtotime() 函数详细介绍

strtotime() 函数语法如下:

int strtotime ( string $time [, int $now = time() ] )
  • time : 日期/时间字符串
  • now : 用来计算返回值的时间戳
  • 本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳,其值相对于 now 参数给出的时间,如果没有提供此参数则用系统当前时间
  • 成功则返回时间戳,否则返回 FALSE,在 PHP 5.1.0 之前本函数在失败时返回 -1
<?php
echo 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() 将返回一个浮点数,毫秒数为小数点部分,如:1528190244.3109
  • 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 类型保存的时间戳,则要使用时间戳进行查询。查询结果是时间戳。


转载请注明出处 PHP日期时间处理
喜欢 (5)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 不错。解析得很透彻,不过少了strtotime字符串常用格式的收集,不然就更完美了。
    wangking2018-09-30 10:51 回复