1. 介绍

1.1 介绍

今天福哥将会给大家讲解PHP编程基础知识日期和时间的使用技巧,这个技术在程序开发时候的使用率还是非常高的,基本上95%以上的项目都离不开日期和时间的应用场景。
关于日期和时间还是有很多知识需要了解的,如果不清楚这些的话,就会遇到很多奇怪的问题。在很多对时间控制很严格的系统里面会有非常复杂的时间处理逻辑,如果没有很好的使用经验甚至功能都无法实现。例如:昨天是什么日子?距离下一个周末还有几天?今年有多少个工作日?想要解决这些问题还是需要好好学习一下日期和时间的使用技巧的。

2. 时区

2.1 时区时间

地球是圆的,处于不同经度地区的人看到的时间是不一样的,在一条经度上的人看到的时间是一样的。所以我们在描述一个时间的时候都会以当地经度上的一个主要城市为准计算当地的时间,例如:北京时间,东京时间,伦敦时间,纽约时间等等。
处于不同经度地区的人看到的时间之间是有差的,这个差就是我们常说的时差。服务器也是存在于某一个经度地区的,所以跨时区操作网站的时候就会有时差问题。
为了解决这个问题程序默认会以一个公共时区UTC的时间为基准,大家都以这个UTC时区的时间记录具体时间,在显示的时候可以根据所在时区与UTC时区的偏移经度计算时差,从而得到本地时区正确的具体时间。

2.2 配置时区

很多国际网站的时间都是以UTC时区记录时间的,然后在用户首次访问网站的时候通过IP地址识别到用户所在地区,根据这个地区的时区经度计算时差,最后显示用户本地的时间出来的。
PHP配置时区需要进入php.ini配置文件里面,搜索“date.timezone”参数,如果是西部地区的朋友就设置成“Asia/Chongqing”,如果是东部地区的朋友就设置成“Asia/Shanghai”,福哥是北京的,但是没有“Asia/Beijing”,福哥也只能设置“Asia/Shanghai”。
date.timezone = Asia/Shanghai

3. 当前时间

3.1 UTC时间

前面介绍时区的时候说过了,为了便于针对不同经度地区的人显示当地的时间系统里面存储的最好是UTC时间,获取UTC时间需要用到gmdate函数。
echo "

当前UTC时间

"; echo gmdate("Y-m-d H:i:s"). "\n";

3.2 本地时间

如果要得到对应本地时区的时间需要使用date函数进行时间的获取。
echo "

当前时区时间

"; echo date("Y-m-d H:i:s"). "\n";

4. 创建时间

如果我们要创建一个时间(或者说是指定一个具体的时间)需要用到mktime函数。
mktime函数可以让我们针对年、月、日、时、分、秒进行特别的定制。而且即便是我们设置一个不存在的日期,例如:2月31日,它依然会返回有效的时间。
echo "

创建时间

"; echo date("Y-m-d H:i:s", mktime(null, null, null, 2, 31, 2021)). "\n";

5. 时间偏移

时间偏移就是根据当前时间向前(过去)或者向后(未来)进行推移得到一个过去时间或者未来时间。

5.1 未来

将当前时间向后偏移可以计算未来的某个时间点。
echo "

明天

"; echo date("Y-m-d H:i:s", strtotime("+1 day")); echo "

下周的今天

"; echo date("Y-m-d H:i:s", strtotime("+1 week")); echo "

距离最近的周日还有". (7-date("w")). "天

"; echo "

下个月的今天是周". (date("w", strtotime("+1 month"))). "

";

5.2 过去

将当前时间向前偏移可以计算未来的某个时间点。
echo "

昨天

"; echo date("Y-m-d H:i:s", strtotime("-1 day")); echo "

上周的今天

"; echo date("Y-m-d H:i:s", strtotime("-1 week")); echo "

8月8日出生的人去年的生日那天是周". date("w", strtotime("-1 year", mktime(0, 0, 0, 8, 8))). "

"; echo "

8月8日出生的人自上次生日到今天过了". ((mktime(0, 0, 0)-strtotime("-1 year", mktime(0, 0, 0, 8, 8)))/(3600*24)). "天

";

6. 格式化

在我们将系统时间输出出来的时候可以通过一些format字符进行格式的自定义,下面是福哥从官网找出来的格式说明,大家可以参考看看。

6.1 格式

6.1.1 日

d:月份中的第几天,有前导零的 2 位数字	01 到31D:星期中的第几天,文本表示,3 个字母	Mon 到Sunj:月份中的第几天,没有前导零	1 到31l:(“L”的小写字母)	星期几,完整的文本格式 Sunday 到SaturdayN:ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加)	1(表示星期一)到7(表示星期天)S:每月天数后面的英文后缀,2 个字符	st,nd,rd 或者 th。可以和 j 一起用w:星期中的第几天,数字表示	0(表示星期天)到6(表示星期六)z:年份中的第几天	0 到365

6.1.2 星期

W:ISO-8601 格式年份中的第几周,每周从星期一开始(PHP 4.1.0 新加的)	例如:42(当年的第 42 周)

6.1.3 月

F:月份,完整的文本格式,例如 January 或者 March	January 到Decemberm:数字表示的月份,有前导零	01 到12M:三个字母缩写表示的月份	Jan 到Decn:数字表示的月份,没有前导零	1 到12t:指定的月份有几天	28 到31

6.1.4 年

L:是否为闰年	如果是闰年为 1,否则为 0o:ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加)	Examples: 1999 or 2003Y:4 位数字完整表示的年份	例如:1999 或2003y:2 位数字表示的年份	例如:99 或03

6.1.5 时间

a:小写的上午和下午值	am 或pmA:大写的上午和下午值	AM 或PMB:Swatch Internet 标准时	000 到999g:小时,12 小时格式,没有前导零	1 到12G:小时,24 小时格式,没有前导零	0 到23h:小时,12 小时格式,有前导零	01 到12H:小时,24 小时格式,有前导零	00 到23i:有前导零的分钟数	00 到59>s:秒数,有前导零	00 到59>u:毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函数总是返回 000000 因为它只接受 integer 参数, 而DateTime::format() 才支持毫秒。	示例: 654321

6.1.6 时区

e:时区标识(PHP 5.1.0 新加)	例如:UTC,GMT,Atlantic/AzoresI:是否为夏令时	如果是夏令时为 1,否则为 0O:与格林威治时间相差的小时数	例如:+0200P:与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加)	例如:+02:00T:本机所在的时区	例如:EST,MDT(【译者注】在Windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)。Z:时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。	-43200 到43200

7. UTC时间转本地时间

UTC时间就是将空格换成“T”,然后在秒后面加上“.000Z”,就可以了。要转换UTC时间为本地时间可以通过strtotime函数完成。
$nowUTC = str_replace(" ", "T", gmdate("Y-m-d H:i:s")). ".000Z"; echo "

UTC时间

"; echo $nowUTC; echo "

通过UTC时间转化为本地时间

"; echo date("Y-m-d H:i:s", strtotime($nowUTC));

8. 总结

今天福哥带着童鞋们对于PHP操作日期和时间的技巧系统地学习了一下,相信经过今天的课程之后童鞋们对于在程序里面使用日期和时间的功能会变得得心应手了。