任何开发平台中时间处理都是最常见不过的开发场景,比如我们经常要将一个时间或者日期格式化显示,将一个时间字符串反序列化为一个时间对象,多个时间之间进行运算等等。
每个开发平台都提供了相应的时间操作框架。php中定义了一系列针对时间和日期的操作函数。本章讲解在php世界中对时间进行常规处理的相关内容。
本文只涉及最常用的场景,比如大型项目中时区等概念将不再涉及。
在学习本文之前需要了解【unix时间戳】的个概念,unix时间戳的含义很简单:
从1970-01-01 00:00:00 到一个指定时间过去的秒数。下文中我们将unix时间戳简称为时间戳。在php中时间戳和时间几乎是同义词,或者说在php世界中用时间戳来表达时间。
date($formatStr,$timeStamp) |
date函数将一个时间格式化,有两个参数 参数1:格式话字符串的规则 参数2:时间戳,默认当前时间的时间戳
此函数返回值是一个字符串
例:date('Y-m-d H:i:s');将按照指定的格式返回当前时间的字符串,比如2020-12-12 01:12:13,格式化规则字符串中的每一个字符有其代表的含义。在下面的【格式化规则参数表】中将详细说明每一个字符的含义。 |
mktime(hour, minute, second, month, day, year) |
使用指定的参数构造一个时间戳,所有参数可选 |
time() |
获取当前时间的时间戳,返回是一个int值 |
microtime([ bool $get_as_float ] ), |
返回当前时间戳和微秒数。 |
strotime(string $time [, int $now = time() ] ) |
此函数用来进行时间运算,第一个参数为运算描述字符串比如'+1 days',第二个参数为时间基础(第二个参数默认为当前时间戳)。总的含义是:在第二个参数的基础上叠加第一个参数指定的运算,以时间戳的方式来返回运算结果。比如:strtotime("+1 week 2 days 4 hours 2 seconds")含义为在当前时间基础上加一周2天4小时2秒,返回的时间戳即是运算结果。更多的例子如下:
//now为现在的当前时间 |
getdate($timestamp) |
参数为时间戳,默认为当前时间的时间戳。返回值为一个数组,其含义为指定时间戳参数的“详细解释”。比如返回值一个例子为 Array |
字符 |
说明 |
返回值 |
d |
月份中的第几天,有前导零的2 位数字 |
01 到31 |
D |
英文星期几,3个字母 |
Mon到Sun |
j |
月份中的第几天,没有前导零 |
1 到31 |
l(字母) |
英文星期几 |
Sunday到 Saturday |
N |
1格式数字表示的星期 |
1(表示星期一)到7(表示星期天) |
S |
每月天数后面的英文后缀,2个字符 |
st,nd,rd或者th。可以和jg一起用 |
w |
星期中的第几天,数字表示 |
0(表示星期天)到 6(表示星期六) |
z |
一年中的第几天 |
0到366 |
W |
年份中的第几周,每周从星期一开始 |
42(当年的第42周) |
F |
月份,完整的文本格式 |
January 到 December |
m |
数字表示月份,有前导零 |
01 到 12 |
M |
3个字母缩写表示的月份 |
Jan 到Dec |
n |
数字表示月份,没有前导零 |
1 到 12 |
t |
给定月份所应有的天数 |
28 到 31 |
L |
是否为闰年 |
如果是闰年为1,否则为o |
o |
格式年份数字 |
例如2007 |
Y |
4 位数字完整表示年份 |
例如1999或2008 |
y |
2 位数字表示的年份 |
例如99或08 |
a |
小写的上午和下午值 |
am或pm |
A |
大写的上午和下午值 |
AM或PM |
g |
小时,12小时格式,没有前导零 |
1到12 |
G |
小时,24小时格式,没有前导零 |
0 到 23 |
i |
有前导零的分钟数 |
00 到 59 |
s |
秒数,有前导零 |
00到59 |
e |
时区标识 |
|
U |
从Unix纪元开始至今的秒数 |
长整型数字 |
上面介绍了php中日期和时间处理的几个常用函数。一般的需求使用这些需求完全可以胜任。php中实现了DateTime类,这个类对时间操作进行了封装。比如可以使用下面的方式来实例化一个DateTime类的对象:
$date = new DateTime();
$date = new DateTime('2018-01-01');
$date = new DateTime('tomorrow');
$date = new DateTime('+2 day');
$date = new DateTime('1408950651');
比如可以使用下面的方法来进行时间运算:
$date->setTimestamp('1514739661');
$date->setDate(2020, 8, 8);
$date->setTime(2, 3, 4);
$date->modify('+1 day');
$date->modify('+1 month');
$date->modify('-1 year');
$date->add(new \DateInterval('P2DT5H2M'));
$date->sub(new \DateInterval('P2DT5H2M'));
$date->setTimezone(new DateTimeZone('Asia/Shanghai'));
可见上面常用函数实现的功能使用DateTime类也可以实现,只是换了一种调用接口的方式,从全局函数的方式替换成了面向对象的调用方式,看起来好像没有什么优势。
Carbon是php的一个类库,其对日期时间操作进行了良好的封装。相对DateTime类现在主流的趋势是使用Carbon类库来操作时间,比如laravel框架中建议使用的日期时间处理类库就是Carbon。
Carbon库中关键类为Carbon,此类继承了php的DateTime类,并且对其进行了改良。基本用法如下:
//使用指定日期或者时间实例化carbon对象
$today = new Carbon('2018-08-01');
//使用描述实例化carbon对象,本月第一天
$first_day = new Carbon('first day of this month');
//上个月的第一天
$first_day = new Carbon('first day of last month');
//快捷函数,今天
$today = Carbon::today()
//快捷函数,昨天
$yesterday = Carbon::yesterday()
//快捷函数,日期格式化
Carbon::yesterday()->toDateString(); //输入字符串2020-09-10
//快捷函数,现在
$now = Carbon::now();
//快捷函数,昨天早上6点
Carbon::parse('yesterday 6pm');
//格式化日期时间字符串
$month->format('Y-m'); // 2020-08
//时间计算
$start = new Carbon('2018-10-04 15:00:03');
$end = new Carbon('2018-10-05 17:00:09');
$start->diff($end)->format('%H:%I:%S');
从上面的函数可以明显看到carbon库提供了非常多的便捷操作,代码看起来要优雅简单很多。在工作和学习中建议大家使用carbon来实现日期和时间操作。
热门评论