同福

PHP的日期和时间的使用技巧【20210406】

介绍

介绍

今天福哥将会给大家讲解PHP编程基础知识日期和时间的使用技巧,这个技术在程序开发时候的使用率还是非常高的,基本上95%以上的项目都离不开日期和时间的应用场景。

关于日期和时间还是有很多知识需要了解的,如果不清楚这些的话,就会遇到很多奇怪的问题。在很多对时间控制很严格的系统里面会有非常复杂的时间处理逻辑,如果没有很好的使用经验甚至功能都无法实现。例如:昨天是什么日子?距离下一个周末还有几天?今年有多少个工作日?想要解决这些问题还是需要好好学习一下日期和时间的使用技巧的。

时区

时区时间

地球是圆的,处于不同经度地区的人看到的时间是不一样的,在一条经度上的人看到的时间是一样的。所以我们在描述一个时间的时候都会以当地经度上的一个主要城市为准计算当地的时间,例如:北京时间,东京时间,伦敦时间,纽约时间等等。

处于不同经度地区的人看到的时间之间是有差的,这个差就是我们常说的时差。服务器也是存在于某一个经度地区的,所以跨时区操作网站的时候就会有时差问题。

为了解决这个问题程序默认会以一个公共时区UTC的时间为基准,大家都以这个UTC时区的时间记录具体时间,在显示的时候可以根据所在时区与UTC时区的偏移经度计算时差,从而得到本地时区正确的具体时间。

配置时区

很多国际网站的时间都是以UTC时区记录时间的,然后在用户首次访问网站的时候通过IP地址识别到用户所在地区,根据这个地区的时区经度计算时差,最后显示用户本地的时间出来的。

PHP配置时区需要进入php.ini配置文件里面,搜索“date.timezone”参数,如果是西部地区的朋友就设置成“Asia/Chongqing”,如果是东部地区的朋友就设置成“Asia/Shanghai”,福哥是北京的,但是没有“Asia/Beijing”,福哥也只能设置“Asia/Shanghai”。

date.timezone = Asia/Shanghai

当前时间

UTC时间

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

echo "<h3>当前UTC时间</h3>";
echo gmdate("Y-m-d H:i:s"). "\n";

本地时间

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

echo "<h3>当前时区时间</h3>";
echo date("Y-m-d H:i:s"). "\n";

创建时间

如果我们要创建一个时间(或者说是指定一个具体的时间)需要用到mktime函数。

mktime函数可以让我们针对年、月、日、时、分、秒进行特别的定制。而且即便是我们设置一个不存在的日期,例如:2月31日,它依然会返回有效的时间。

echo "<h3>创建时间</h3>";
echo date("Y-m-d H:i:s", mktime(null, null, null, 2, 31, 2021)). "\n";

时间偏移

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

未来

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

echo "<h3>明天</h3>";
echo date("Y-m-d H:i:s", strtotime("+1 day"));
echo "<h3>下周的今天</h3>";
echo date("Y-m-d H:i:s", strtotime("+1 week"));
echo "<h3>距离最近的周日还有". (7-date("w")). "天</h3>";
echo "<h3>下个月的今天是周". (date("w", strtotime("+1 month"))). "</h3>";

home/topic/2021/0406/22/9290ad2e964df801af8ec9ab1aa779c4.jpg

过去

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

echo "<h3>昨天</h3>";
echo date("Y-m-d H:i:s", strtotime("-1 day"));
echo "<h3>上周的今天</h3>";
echo date("Y-m-d H:i:s", strtotime("-1 week"));
echo "<h3>8月8日出生的人去年的生日那天是周". date("w", strtotime("-1 year", mktime(0, 0, 0, 8, 8))). "</h3>";
echo "<h3>8月8日出生的人自上次生日到今天过了". ((mktime(0, 0, 0)-strtotime("-1 year", mktime(0, 0, 0, 8, 8)))/(3600*24)). "天</h3>";

home/topic/2021/0406/22/11e656b3c720a926ce70bb8459bceae7.jpg

格式化

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

格式

  • d:月份中的第几天,有前导零的 2 位数字 01 到 31

  • D:星期中的第几天,文本表示,3 个字母 Mon 到 Sun

  • j:月份中的第几天,没有前导零 1 到 31

  • l:(“L”的小写字母) 星期几,完整的文本格式 Sunday 到 Saturday

  • N:ISO-8601 格式数字表示的星期中的第几天(PHP 5.1.0 新加) 1(表示星期一)到 7(表示星期天)

  • S:每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用

  • w:星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)

  • z:年份中的第几天 0 到 365

星期

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

  • F:月份,完整的文本格式,例如 January 或者 March January 到 December

  • m:数字表示的月份,有前导零 01 到 12

  • M:三个字母缩写表示的月份 Jan 到 Dec

  • n:数字表示的月份,没有前导零 1 到 12

  • t:指定的月份有几天 28 到 31

  • L:是否为闰年 如果是闰年为 1,否则为 0

  • o:ISO-8601 格式年份数字。这和 Y 的值相同,只除了如果 ISO 的星期数(W)属于前一年或下一年,则用那一年。(PHP 5.1.0 新加) Examples: 1999 or 2003

  • Y:4 位数字完整表示的年份 例如:1999 或 2003

  • y:2 位数字表示的年份 例如:99 或 03

时间

  • a:小写的上午和下午值 am 或 pm

  • A:大写的上午和下午值 AM 或 PM

  • B:Swatch Internet 标准时 000 到 999

  • g:小时,12 小时格式,没有前导零 1 到 12

  • G:小时,24 小时格式,没有前导零 0 到 23

  • h:小时,12 小时格式,有前导零 01 到 12

  • H:小时,24 小时格式,有前导零 00 到 23

  • i:有前导零的分钟数 00 到 59>

  • s:秒数,有前导零 00 到 59>

  • u:毫秒 (PHP 5.2.2 新加)。需要注意的是 date() 函数总是返回 000000 因为它只接受 integer 参数, 而 DateTime::format() 才支持毫秒。 示例: 654321

时区

  • e:时区标识(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores

  • I:是否为夏令时 如果是夏令时为 1,否则为 0

  • O:与格林威治时间相差的小时数 例如:+0200

  • P:与格林威治时间(GMT)的差别,小时和分钟之间有冒号分隔(PHP 5.1.3 新加) 例如:+02:00

  • T:本机所在的时区 例如:EST,MDT(【译者注】在 Windows 下为完整文本格式,例如“Eastern Standard Time”,中文版会显示“中国标准时间”)。

  • Z:时差偏移量的秒数。UTC 西边的时区偏移量总是负的,UTC 东边的时区偏移量总是正的。 -43200 到 43200

UTC时间转本地时间

UTC时间就是将空格换成“T”,然后在秒后面加上“.000Z”,就可以了。要转换UTC时间为本地时间可以通过strtotime函数完成。

$nowUTC = str_replace(" ", "T", gmdate("Y-m-d H:i:s")). ".000Z";
echo "<h3>UTC时间</h3>";
echo $nowUTC;
echo "<h3>通过UTC时间转化为本地时间</h3>";
echo date("Y-m-d H:i:s", strtotime($nowUTC));

home/topic/2021/0406/23/3a6113ad66ce1201bf8d56da71776531.jpg

总结

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

照惯例接下来福哥会以此给大家讲解其他语言的日期和时间的使用技巧,大家敬请期待吧~~