首页 » 网站推广 » php生成日期技巧_PHP中的日期相关函数一

php生成日期技巧_PHP中的日期相关函数一

访客 2024-11-08 0

扫一扫用手机浏览

文章目录 [+]

$timezone=newDateTimeZone('Asia/Shanghai');var_dump($timezone);//object(DateTimeZone)#1(2){//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}

在实例化这个 DateTimeZone 时区类时,须要通报一个时区参数。
这里我们给的便是通用的中国时区的设置,虽说我们的国际标准时区是东八区的北京韶光,但在 PHP 中的时区格式中,我们的时区因此上海为命名的。

这个时区类可以直接获得当前指定时区的定位信息,比如 Asia/Shanghai 的定位信息便是直接定位到上海市的。

php生成日期技巧_PHP中的日期相关函数一

//时区干系的定位信息var_dump($timezone->getLocation());//array(4){//["country_code"]=>//string(2)"CN"//["latitude"]=>//float(31.23333)//["longitude"]=>//float(121.46666)//["comments"]=>//string(12)"BeijingTime"//}

通过 getLocation() 就可以获取到时区类的定位信息,经纬度的查询结果便是上海市中央,comments 字段也明确地指出了当前时区是北京韶光。

php生成日期技巧_PHP中的日期相关函数一
(图片来自网络侵删)

//时区名称var_dump($timezone->getName());//string(13)"Asia/Shanghai"//相对付GMT的时差var_dump($timezone->getOffset(newDateTime('now',$timezone)));//int(28800)//所有时区转换信息var_dump($timezone->getTransitions(time()));//array(1){//[0]=>//array(5){//["ts"]=>//int(1601168813)//["time"]=>//string(24)"2020-09-27T01:06:53+0000"//["offset"]=>//int(28800)//["isdst"]=>//bool(false)//["abbr"]=>//string(3)"CST"//}//}

getName() 方法获取的是当前时区的名称,这个就不用多说了。
getOffset() 则是获取到与国际格林尼治韶光(GMT)的差值,也便是与子午线的韶光间隔,这里返回的是秒,转换成小时后恰好便是 8 小时。
getTransitions() 函数返回的是所有时区转换的韶光,我测试的韶光是早上,返回的 time 字段内容是格林尼治韶光,offset 字段返回的也是与GMT韶光的差值。
GMT韶光与UTC韶光是同等的,我们在日常的学习和事情中如果打仗到了这两个名词可以将它们看做是相同的观点。

UTC韶光的标准叫法是折衷天下韶光,基于国际原子韶光,全天下的国家的标准韶光都因此它为标准进行调校的,而GMT的本意是定位为本初子午线的平太阳时,UTC也因此这条经线为基准进行时区划分的。
不过,按照严格的标准来说,它们并不是完备相等的,详细的内容大家可以自行查阅,但对付我们日常开拓来说,完备可以将它们视为等同的东西。

//包含dst(夏令时),时差和时区信息的关联数组var_dump(DateTimeZone::listAbbreviations());//array(144){//["acdt"]=>//array(6){//[0]=>//array(3){//["dst"]=>//bool(true)//["offset"]=>//int(37800)//["timezone_id"]=>//string(18)"Australia/Adelaide"//}//[1]=>//array(3){//["dst"]=>//bool(true)//["offset"]=>//int(37800)//["timezone_id"]=>//string(21)"Australia/Broken_Hill"//}//……//……//包含了所有时区标示符的索引数组var_dump(DateTimeZone::listIdentifiers());//array(426){//[0]=>//string(14)"Africa/Abidjan"//[1]=>//string(12)"Africa/Accra"//[2]=>//string(18)"Africa/Addis_Ababa"//[3]=>//string(14)"Africa/Algiers"//……//……

listAbbreviations() 静态方法返回的是 夏令时 干系的时差和时区信息。
夏令时 和 冬令时 也是西方国家的一种生活标准,我们打仗的不多,这里就不做讲解了,对付做跨境项目或者欧美外包的同学该当不会陌生。
listIdentifiers() 方法返回的是包含了所有时区标示符的索引数组,这里可以看到所有的支持的时区信息。

日期间隔操作

对时日期韶光的间隔操作,或许大家多少都做过一点,比如 DateTime 工具的那个 diff() 方法。

$today=newDateTime('2020-09-27');$beforeYestoday=newDateTime("2020-09-25");var_dump($today->diff($beforeYestoday));//object(DateInterval)#5(16){//["y"]=>//int(0)//["m"]=>//int(0)//["d"]=>//int(2)//["h"]=>//int(0)//["i"]=>//int(0)//["s"]=>//int(0)//["f"]=>//float(0)//["weekday"]=>//int(0)//["weekday_behavior"]=>//int(0)//["first_last_day_of"]=>//int(0)//["invert"]=>//int(1)//["days"]=>//int(2)//["special_type"]=>//int(0)//["special_amount"]=>//int(0)//["have_weekday_relative"]=>//int(0)//["have_special_relative"]=>//int(0)//}

从打印的结果可以看出,diff() 工具返回的是一个 DateInterval 工具。
这个便是我们这节的主角了,关于它打印出来的这些属性内容就不多阐明了,字段名已经非常直不雅观了,值便是详细的差值。

$interval=newDateInterval("P2D");var_dump($interval);//object(DateInterval)#2(16){//["y"]=>//int(0)//["m"]=>//int(0)//["d"]=>//int(2)//["h"]=>//int(0)//["i"]=>//int(0)//["s"]=>//int(0)//["f"]=>//float(0)//["weekday"]=>//int(0)//["weekday_behavior"]=>//int(0)//["first_last_day_of"]=>//int(0)//["invert"]=>//int(0)//["days"]=>//bool(false)//["special_type"]=>//int(0)//["special_amount"]=>//int(0)//["have_weekday_relative"]=>//int(0)//["have_special_relative"]=>//int(0)//}

看到没有?打印出来的内容和上面用 diff() 方法返回的工具的内容是同等的,但是它的布局函数的参数很奇怪。
没错,当我们自己去实例化一个 DateInterval 工具时,须要为它定义它的间隔信息,这个间隔信息便是我们通过布局函数的参数通报进去的。
P2D 的意思便是间隔 2 天,首先必须以一个 P 为开头,然后可以有 Y、M、D 这些日期内容,如果须要韶光内容的话,须要一个 T 然后再跟上 H、M、S 这些内容。
比如 P2Y4DT6H8M 表示的便是 2年4天6小时8分钟 的韶光间隔。
详细的规则大家还是去看文档中的解释:https://www.php.net/manual/zh/dateinterval.construct.php。

$interval=newDateInterval("P2Y4DT6H8M");var_dump($interval);//object(DateInterval)#5(16){//["y"]=>//int(2)//["m"]=>//int(0)//["d"]=>//int(4)//["h"]=>//int(6)//["i"]=>//int(8)//["s"]=>//int(0)//["f"]=>//float(0)//["weekday"]=>//int(0)//["weekday_behavior"]=>//int(0)//["first_last_day_of"]=>//int(0)//["invert"]=>//int(0)//["days"]=>//bool(false)//["special_type"]=>//int(0)//["special_amount"]=>//int(0)//["have_weekday_relative"]=>//int(0)//["have_special_relative"]=>//int(0)//}

我们还可以通过字段串形式的日期数据返回间隔工具,比如:

//从日期语句创建韶光间隔var_dump(DateInterval::createFromDateString('2days'));//object(DateInterval)#3(16){//["y"]=>//int(0)//["m"]=>//int(0)//["d"]=>//int(2)//["h"]=>//int(0)//["i"]=>//int(0)//["s"]=>//int(0)//["f"]=>//float(0)//["weekday"]=>//int(0)//["weekday_behavior"]=>//int(0)//["first_last_day_of"]=>//int(0)//["invert"]=>//int(0)//["days"]=>//bool(false)//["special_type"]=>//int(0)//["special_amount"]=>//int(0)//["have_weekday_relative"]=>//int(0)//["have_special_relative"]=>//int(0)//}

此外,在得到工具后进行输出的时候,DateInterval 工具也为我们供应了一个 format() 方法,可以像 printf() 函数一样来格式化地输出日期信息,而且这里用的格式符还是日期的格式符。

var_dump($interval->format('%y%d%h%i'));//string(7)"2468"

输出的内容实在便是属性中对应的那些日期和韶光差值。

韶光周期干系函数

说完韶光间隔了,我们再来看看韶光周期。
韶光周期是个什么观点呢?就比如说我们要每三天间隔一次地获取日期,这时就可以用韶光周期干系的类来进行处理。

$start=newDateTime('2020-09-01');$interval=newDateInterval('P7D');$end=newDateTime('2020-09-30');$daterange=newDatePeriod($start,$interval,$end);var_dump($daterange);//object(DatePeriod)#7(6){//["start"]=>//object(DateTime)#8(3){//["date"]=>//string(26)"2020-09-0100:00:00.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}//["current"]=>//NULL//["end"]=>//object(DateTime)#9(3){//["date"]=>//string(26)"2020-09-3000:00:00.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}//["interval"]=>//object(DateInterval)#10(16){//["y"]=>//int(0)//["m"]=>//int(0)//["d"]=>//int(7)//["h"]=>//int(0)//["i"]=>//int(0)//["s"]=>//int(0)//["f"]=>//float(0)//["weekday"]=>//int(0)//["weekday_behavior"]=>//int(0)//["first_last_day_of"]=>//int(0)//["invert"]=>//int(0)//["days"]=>//bool(false)//["special_type"]=>//int(0)//["special_amount"]=>//int(0)//["have_weekday_relative"]=>//int(0)//["have_special_relative"]=>//int(0)//}//["recurrences"]=>//int(1)//["include_start_date"]=>//bool(true)//}foreach($daterangeas$date){echo$date->format("Ymd"),PHP_EOL;}//20200901//20200908//20200915//20200922//20200929

首先设定了开始韶光和结束韶光以及一个韶光间隔工具,然后用它们做为参数来天生一个 DatePeriod 韶光周期工具。
它是一个实现了迭代器的工具,以是我们可以直接遍历它,结果便是以 P7D ,也便是 7 天为间隔的一组日期数据。

var_dump($daterange->getDateInterval());//object(DateInterval)#11(16){//["y"]=>//int(0)//["m"]=>//int(0)//["d"]=>//int(7)//["h"]=>//int(0)//["i"]=>//int(0)//["s"]=>//int(0)//["f"]=>//float(0)//["weekday"]=>//int(0)//["weekday_behavior"]=>//int(0)//["first_last_day_of"]=>//int(0)//["invert"]=>//int(0)//["days"]=>//bool(false)//["special_type"]=>//int(0)//["special_amount"]=>//int(0)//["have_weekday_relative"]=>//int(0)//["have_special_relative"]=>//int(0)//}var_dump($daterange->getStartDate());//object(DateTime)#11(3){//["date"]=>//string(26)"2020-09-0100:00:00.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}var_dump($daterange->getEndDate());//object(DateTime)#11(3){//["date"]=>//string(26)"2020-09-3000:00:00.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}

它的这一堆方法实在返回的便是我们定义的那些布局参数信息。
其余,它还可以指定从开始日期今后按照韶光间隔返回几条信息。

$period=newDatePeriod($start,$interval,4);foreach($periodas$date){echo$date->format("Ymd"),PHP_EOL;}//20200901//20200908//20200915//20200922//20200929var_dump($period->getRecurrences());//int(4)

recurrences 参数的浸染便是按照指定的韶光间隔返回几条信息,这里我们是返回 9月1号 之后每次间隔 7 天的 4 条信息,和上面的内容一样。
这时我们修正布局函数的值为其它数量,比如修正为 2 ,那么就只会返回到 9月15号 的信息了。
它不会受到结束日期的约束,可以返回从开始日期到指天命量之后的所有信息,大家可以自己考试测验一下。

总结

本日学习的内容不知道大家有没有打仗过,反正我是只用过 diff() 方法来处理过日期之间的差值问题,而且也并没有把稳到过它返回的这个工具详细的内容。
而其余两个工具则是压根没有印象,完备便是没听说过的觉得。
以是说,平常多刷刷手册还是非常有帮助的,本日学习的内容又让我们知道了很多东西,而且 DatePeriod 在详细的业务实现中是肯定会有利用场景的。
学习不止,后面我们要学习的内容依然精彩。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/12.PHP中的日期干系函数(一).php

参考文档:

https://www.php.net/manual/zh/book.datetime.php

标签:

相关文章