为什么说这个 Calendar 扩大很好玩呢?因为你根本用不到它!这个扩大是一套对于日期历法的扩大,然而对于咱们来说,它没有农历的相干操作,所以对于咱们中国人来说这个扩大并没有什么理论的作用。不过这并不障碍咱们去理解学习它。
日期历法类型
对于失常状况下的日期操作来说,PHP 默认应用的是 UTC 工夫,也就是国际标准工夫,对于咱们国家来说,须要在规范 UTC 的工夫上加 8 来示意北京工夫东八区。当然,也能够间接批改 php.ini 或者数据库中的时区相干参数来定义好日期时区。
标准时区对应的其实就是格里高利工夫历法 Gregorian。也就是咱们当初最罕用的公历、阳历日期。Calendar 扩大中除了这个规范的公历历法之外,还反对 犹太历法 Jewish、法历 French 以及另一个十分闻名的 儒略历 Julian。咱们的 Gregorian 历法就是从 Julian 历中演变而来的,它们的差距并不大,但 犹太历 和 法历 的差距就比拟大了,一会在上面的代码中咱们将看到各种历法之间的差异。
对于这些历法的具体内容大家能够自行查问一下相干的材料,也可能学习到一些乏味的历史常识,比方为什么废除了 儒略历 而将公历定为了 格里历。还有 法历 为什么只有短短的那些年,犹太历 为什么年份记得这么大了。法历 和 犹太历 月份名字的起源等,都是很乏味的故事。
Calendar 扩大装置及历法信息查看
Calendar 扩大曾经集成在 PHP 安装包中了,不须要特地的独自去装置。如果你无奈应用 Calendar 相干的函数,能够从新编译 PHP 并加上 –enable-calendar 参数即可。
接下来咱们看下指定历法的详细信息,这里咱们指定的是 犹太历。
$info = cal_info(2);
print_r($info);
// Array
// (// [months] => Array
// (// [1] => Tishri
// [2] => Heshvan
// [3] => Kislev
// [4] => Tevet
// [5] => Shevat
// [6] => Adar I
// [7] => Adar II
// [8] => Nisan
// [9] => Iyyar
// [10] => Sivan
// [11] => Tammuz
// [12] => Av
// [13] => Elul
// )
// [abbrevmonths] => Array
// (// [1] => Tishri
// [2] => Heshvan
// [3] => Kislev
// [4] => Tevet
// [5] => Shevat
// [6] => Adar I
// [7] => Adar II
// [8] => Nisan
// [9] => Iyyar
// [10] => Sivan
// [11] => Tammuz
// [12] => Av
// [13] => Elul
// )
// [maxdaysinmonth] => 30
// [calname] => Jewish
// [calsymbol] => CAL_JEWISH
// )
cal_info() 函数接管的参数是一个常量,别离是 CAL_GREGORIAN,CAL_JULIAN,CAL_JEWISH,CAL_FRENCH,它们对应的数字就是 0,1,2,3。在这段代码中,咱们返回的就是 CAL_JEWISH 的信息。能够看出,犹太历 中的月份名称与公历中的英文名称都不一样,比方这里有 尼撒月 Nisan、提市黎月 Tishri。具体的内容就不深究了,毕竟咱们在日常生活中是齐全接触不到这种历法的。
大家能够本人试试其它历法返回的信息内容,公历和儒略历是一样的,法历中的月份名字就又不一样了,而且这些名字还都很有意思。
日期历法转换
首先,要进行历法转换的话,咱们要将指定的日期转换成 Julian Days 计数。这个 jd 计数能够看作是 Calendar 扩大的一个两头变量,用于各种历法之间的换算。
// 转变 Unix 工夫戳为 Julian Day 计数
$today = unixtojd(mktime(0, 0, 0, 9, 23, 2020));
echo $today, PHP_EOL; // 2459116
应用 unixtojd() 函数就能够将一个 unix 工夫戳转换成 jd 计数。接下来,咱们看看 2020 年 9 月 23 号对应的 犹太历 是哪一天。
// 获取以后犹太历工夫
print_r(cal_from_jd($today, CAL_JEWISH));
// Array
// (// [date] => 1/5/5781
// [month] => 1
// [day] => 5
// [year] => 5781
// [dow] => 3
// [abbrevdayname] => Wed
// [dayname] => Wednesday
// [abbrevmonth] => Tishri
// [monthname] => Tishri
// )
返回的信息中曾经很明确了吧,咱们这一天是 犹太历 的 5781 年 1 月 5 号 星期三。以后的月份是 Tishri 提市黎月,对应着公历年的第一个月,犹太历中教会年的第七个月,代表着秋天的到来。
cal_from_jd() 函数的作用就是依据 jd 计数 返回指定历法的详细信息。而另外一个 cal_to_jd() 函数则是从一个反对的历法数据转换为 jd 计数。
echo cal_to_jd(CAL_JEWISH, 1, 5, 5781), PHP_EOL; // 2459116
echo cal_to_jd(CAL_GREGORIAN,9, 23, 2020), PHP_EOL; // 2459116
能够看到下面 犹太历 返回的 jd 计数 和咱们公历返回的 jd 计数 是统一的。
当然,咱们也能够将 jd 计数 的日期转换成 unix 工夫。
echo date("Y-m-d", jdtounix($today)), PHP_EOL;
// 2020-09-23
除了 cal_from_jd() 和 cal_to_jd() 之外,Calendar 扩大还为咱们提供了一些快捷的函数进行日期的转换,只不过它们是间接返回的字符串类型的日期信息,不是像 cal_from_jd() 函数一样返回日期的详细信息。
// 转变一个 Gregorian 历法日期到 Julian Day 计数
$jd = GregorianToJD(9, 23, 2020);
// 转变一个 Julian Day 计数为 Gregorian 历法日期
echo jdtogregorian($jd), PHP_EOL; // 9/23/2020
// 转变一个 Julian Day 计数为 Julian 历法日期
echo jdtojulian($jd), PHP_EOL; // 9/10/2020
// 转变一个 Julian Day 计数为犹太历法日期
echo jdtojewish($jd), PHP_EOL; // 1/5/5781
// 转变一个 Julian Day 计数为 unix 工夫戳
echo jdtounix($jd), PHP_EOL; // 1600819200
$jd = GregorianToJD(9, 23, 1799);
// 转变一个 Julian Day 计数为 French 历法日期
echo jdtofrench($jd), PHP_EOL; // 1/1/8
GregorianToJD() 办法就是快捷地转换一个公历日期为 jd 计数。而 jdtoxxxxx 为些函数就是疾速地返回 jd 计数 对应的日期历法的字符串信息。
大家能够留神下,法历 日期只能是公历 1792 年 9 月 22 日到 1806 年 9 月 22 日 这段日期以内的日期,也就是 法兰西第一共和国 成立后推出的 法历,并在 1806 年 完结应用,因为 1804 年 拿破仑 成立了 法兰西第一帝国。帝国废止了 法历(共和历)并全面推行 公历。
某个月份的天数
下面的历史常识学习的怎么样?接下来还是回归到 Calendar 扩大中的学习中来。
$num = cal_days_in_month(CAL_GREGORIAN, 2, 2020);
echo $num, PHP_EOL; // 29
cal_days_in_month() 函数是返回指定历法月份的天数,比方咱们看看 2020 年的 2 月 是不是 闰月 就能够用这个函数来实现。
复活节彩蛋
复活节是东方十分重要的一个节日,所以在 Calendar 扩大中就有函数能够间接取得指定年份的复活节日期。对于复活节的计算形式其实还是比较复杂的,手工推算是比拟麻烦的,而程序计算就十分不便了。
// 指定年份的复活节工夫戳
echo date("M-d-Y", easter_date(2019)), PHP_EOL; // Apr-21-2019
echo date("M-d-Y", easter_date(2020)), PHP_EOL; // Apr-12-2020
echo date("M-d-Y", easter_date(2021)), PHP_EOL; // Apr-04-2021
// 3 月 21 日到复活节之间的天数
echo easter_days(2019), PHP_EOL; // 31
echo easter_days(2020), PHP_EOL; // 22
echo easter_days(2021), PHP_EOL; // 14
easter_date() 函数就是返回指定年份的复活节日期。而 easter_days() 函数则是返回从当年公历的 3 月 21 日 到复活节之间的天数。
复活节是每年春分月圆后的第一个星期日,而春分个别是在 3 月 21 日,这就简化为只有计算满月的日期和紧挨的星期日的日期就能够失去每年复活节的具体日期了。这种函数在东方世界的软件开发中会十分罕用,其实就像咱们须要获取每年春节的具体公历日期一样。
总结
是不是很有意思的一套扩大函数。不过对于咱们次要面向国内开发的开发者来说用途的确不大,但笔者在学习这个扩大的时候另外播种了不少历史方面的常识,也算是开了眼界,也不失为一大播种,大家也本人试着玩玩并且查查相干的历史常识吧,说不定你的播种会更多!
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/10.PHP 中十分好玩的 Calendar 扩大学习.php
参考文档:
https://www.php.net/manual/zh/book.calendar.php
===========
各自媒体平台均可搜寻【硬核项目经理】