当前位置: 首页 > 后端技术 > PHP

非常有趣的CalendarextensionlearninginPHP

时间:2023-03-29 22:51:20 PHP

为什么这个日历扩展很有趣?因为你基本上从不使用它!这个扩展是一套关于日期和日历的扩展,但是对于我们来说,它没有农历相关的操作,所以这个扩展对我们中国人没有实际作用。但这并不妨碍我们去了解它。日期日历类型对于正常情况下的日期操作,PHP默认使用UTC时间,也就是国际标准时间。对于我们国家来说,我们需要在标准的UTC时间上加8来代表北京时间八区。当然你也可以直接在php.ini或者数据库中修改时区相关参数来定义日期时区。标准时区对应公历格里高利历。也就是我们最常用的公历和公历日期。除了标准的公历外,日历扩展还支持犹太历、法国历和另一个非常著名的儒略历。我们的公历是从儒略历演变而来的。它们之间的差距不大,但犹太历和法定历的差距比较大。在下面的代码中,我们将看到各种日历之间的区别。不同之处。关于这些历法的具体内容,大家可以自行查阅相关资料,也可以了解到一些有趣的历史知识,比如为什么要废除儒略历,将公历定为公历等。还有,为什么法国历法的年份只有短短的几年,而犹太历法的年份却那么大。公历和犹太历中月份名称的由来等等,都是很有趣的故事。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]=>AdarI//[7]=>AdarII//[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]=>AdarI//[7]=>AdarII//[8]=>Nisan//[9]=>Iyyar//[10]=>Sivan//[11]=>Tammuz//[12]=>Av//[13]=>埃卢尔//)//[maxdaysinmonth]=>30//[calname]=>Jewish//[calsymbol]=>CAL_JEWISH//)cal_info()函数接收的参数是一个常量,分别是CAL_GREGORIAN、CAL_JULIAN、CAL_JEWISH、CAL_FRENCH,以及它们对应的数字也就是0,1,2,3在这段代码中,我们返回的是CAL_JEWISH的信息。可见,犹太历中的月份名称与公历中的英文名称不同。例如,这里有尼散月和提市黎月。具体内容我就不细说了,毕竟我们在日常生活中接触不到这种日历。您可以自己尝试其他日历返回的信息。公历和儒略历是一样的,但是法历中月份的名称不同,而且这些名称很有意思。日期-日历转换首先,要执行日历转换,我们需要将指定日期转换为儒略日计数。这个jd计数可以看作是Calendar扩展的一个中间变量,用于各种日历之间的转换。//将Unix时间戳转换为儒略日计数$today=unixtojd(mktime(0,0,0,9,23,2020));echo$今天,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日,星期三。现在的月份是提市黎月,对应公历年的第一个月和犹太历教会年的第七个月,代表秋天的到来。cal_from_jd()函数的作用是根据jd计数返回指定日历的详细信息。另一个cal_to_jd()函数将支持的日历数据转换为jd计数。echocal_to_jd(CAL_JEWISH,1,5,5781),PHP_EOL;//2459116echocal_to_jd(CAL_GREGORIAN,9,23,2020),PHP_EOL;//2459116可以看到上面犹太历返回的jd计数和我们公历返回的jd计数是一致的。当然我们也可以将jdcount的日期转换成unix时间。echodate("Y-m-d",jdtounix($today)),PHP_EOL;//2020-09-23除了cal_from_jd()和cal_to_jd()之外,Calendar扩展还为我们提供了一些日期转换的快捷函数,只是它们是直接返回的字符串类型的日期信息,而不是像cal_from_jd()函数那样返回的日期的详细信息。//将公历日期转换为儒略日计数$jd=GregorianToJD(9,23,2020);//将儒略日计数转换为公历日期echojdtogregorian($jd),PHP_EOL;//9/23/2020//将儒略日计数转换为儒略历日期echojdtojulian($jd),PHP_EOL;//9/10/2020//将儒略日计数转换为犹太历日期echojdtojewish($jd),PHP_EOL;//1/5/5781//将儒略日计数转换为unix时间戳echojdtounix($jd),PHP_EOL;//1600819200$jd=GregorianToJD(9,23,1799);//将儒略日计数转换为法历日期echojdtofrench($jd),PHP_EOL;//1/1/8GregorianToJD()方法是将一个公历日期快速转换为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;//29cal_days_in_month()函数返回指定日历月的天数,例如,我们可以使用此函数查看2020年2月是否为闰月完成。复活节彩蛋复活节在西方是一个非常重要的节日,所以在Calendar扩展中有一个函数可以直接获取指定年份的复活节日期。复活节的计算方法其实相当复杂。手工计算比较麻烦,但是程序计算很方便。//指定年份的复活节时间戳echodate("M-d-Y",easter_date(2019)),PHP_EOL;//Apr-21-2019echodate("M-d-Y",easter_date(2020)),PHP_EOL;//Apr-12-2020echodate("M-d-Y",easter_date(2021)),PHP_EOL;//Apr-04-2021//3月21日到复活节的天数echoeaster_days(2019),PHP_EOL;//31echoeaster_days(2020),PHP_EOL;//22echoeaster_days(2021),PHP_EOL;//14easter_date()函数返回指定年份的复活节日期。easter_days()函数返回当前公历中从3月21日到复活节的天数。复活节是每年春分满月后的第一个星期日,而春分一般在3月21日,简化为只计算满月的日期和下一个星期日的日期即可得到具体日期每年复活节。.这种函数在西方世界的软件开发中是非常常用的,就像我们需要获取每年春节的具体公历日期一样。总结不是很有趣的一组扩展函数。不过对于我们这些以国内开发为主的开发者来说用处确实不是很大,不过笔者在学习这个扩展的时候也收获了很多历史知识,也算是大开眼界了,也是一个很大的收获.尝试游玩并查阅相关的历史知识,说不定你会收获更多呢!测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/10。很好玩的PHP日历扩展学习。php参考文档:https://www.php。net/manual/zh/book.calendar.php============各媒体平台均可搜索【硬核项目经理】