简单、好用的php 集成开发环境 Xserver

php基础——日期和时间操作

任何开发平台中时间处理都是最常见不过的开发场景,比如我们经常要将一个时间或者日期格式化显示,将一个时间字符串反序列化为一个时间对象,多个时间之间进行运算等等。

每个开发平台都提供了相应的时间操作框架。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为现在的当前时间
echo strtotime("now")."<br />";
//2000
910
echo strtotime("10 September 2000")."<br />";
//
当前时间加一天
echo strtotime("+1 day")."<br />";
//
当前时间加一周
echo strtotime("+1 week")."<br />";
//
当前时间加一周24小时2
echo strtotime("+1 week 2 days 4 hours 2 seconds")."<br />";
//
下一个星期四
echo strtotime("next Thursday")."<br />";
//
上一个星期一
echo strtotime("last Monday")."<br />";

getdate($timestamp)

参数为时间戳,默认为当前时间的时间戳。返回值为一个数组,其含义为指定时间戳参数的“详细解释”。比如返回值一个例子为

Array
(
    [seconds] => 1                        //

    [minutes] => 10                        //分钟
    [hours] => 17                        //小时
    [mday] => 18                        //
    [wday] => 0                        //星期中的第几天
    [mon] => 1                        //
    [year] => 2015                        //
    [yday] => 17                        //年中的第几天
    [weekday] => Sunday                //星期
    [month] => January                //月份
    [0] => 1421597401                //时间戳
)
 

格式化规则参数表 

字符

说明

返回值

d

月份中的第几天,有前导零的2 位数字

01 31

D

英文星期几,3个字母

MonSun

j

月份中的第几天,没有前导零

1 31

l(字母)

英文星期几

Sunday Saturday

N

1格式数字表示的星期

1(表示星期一)到7(表示星期天)

S

每月天数后面的英文后缀,2个字符

stndrd或者th。可以和jg一起用

w

星期中的第几天,数字表示

0(表示星期天)到 6(表示星期六)

z

一年中的第几天

0366

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 位数字完整表示年份

例如19992008

y

2 位数字表示的年份

例如9908

a

小写的上午和下午值

ampm

A

大写的上午和下午值

AMPM

g

小时,12小时格式,没有前导零

112

G

小时,24小时格式,没有前导零

0 23

i

有前导零的分钟数

00 59

s

秒数,有前导零

0059

e

时区标识

 

U

Unix纪元开始至今的秒数

长整型数字

DateTime类和Carbon 

上面介绍了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来实现日期和时间操作。

热门评论

  • lxbfYeaa
    e
  • lxbfYeaa
    e