为什么说这个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]=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]=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。具体的内容就不深究了,毕竟我们在日常生活中是完全接触不到这种历法的。
大家可以自己试试其它历法返回的信息内容,公历和儒略历是一样的,法历中的月份名字就又不一样了,而且这些名字还都很有意思。
日期历法转换首先,要进行历法转换的话,我们要将指定的日期转换成JulianDays计数。这个jd计数可以看作是Calendar扩展的一个中间变量,用于各种历法之间的换算。
//转变Unix时间戳为JulianDay计数$today=unixtojd(mktime(0,0,0,9,23,));echo$today,PHP_EOL;//
使用unixtojd()函数就可以将一个unix时间戳转换成jd计数。接下来,我们看看年9月23号对应的犹太历是哪一天。
//获取当前犹太历时间print_r(cal_from_jd($today,CAL_JEWISH));//Array//(//[date]=1/5///[month]=1//[day]=5//[year]=//[dow]=3//[abbrevdayname]=Wed//[dayname]=Wednesday//[abbrevmonth]=Tishri//[monthname]=Tishri//)
返回的信息中已经很明确了吧,我们这一天是犹太历的年1月5号星期三。当前的月份是Tishri提市黎月,对应着公历年的第一个月,犹太历中教会年的第七个月,代表着秋天的到来。
cal_from_jd()函数的作用就是根据jd计数返回指定历法的详细信息。而另外一个cal_to_jd()函数则是从一个支持的历法数据转换为jd计数。
echocal_to_jd(CAL_JEWISH,1,5,),PHP_EOL;//echocal_to_jd(CAL_GREGORIAN,9,23,),PHP_EOL;//
可以看到上面犹太历返回的jd计数和我们公历返回的jd计数是一致的。
当然,我们也可以将jd计数的日期转换成unix时间。
echodate("Y-m-d",jdtounix($today)),PHP_EOL;//-09-23
除了cal_from_jd()和cal_to_jd()之外,Calendar扩展还为我们提供了一些快捷的函数进行日期的转换,只不过它们是直接返回的字符串类型的日期信息,不是像cal_from_jd()函数一样返回日期的详细信息。
//转变一个Gregorian历法日期到JulianDay计数$jd=GregorianToJD(9,23,);//转变一个JulianDay计数为Gregorian历法日期echojdtogregorian($jd),PHP_EOL;//9/23///转变一个JulianDay计数为Julian历法日期echojdtojulian($jd),PHP_EOL;//9/10///转变一个JulianDay计数为犹太历法日期echojdtojewish($jd),PHP_EOL;//1/5///转变一个JulianDay计数为unix时间戳echojdtounix($jd),PHP_EOL;//$jd=GregorianToJD(9,23,);//转变一个JulianDay计数为French历法日期echojdtofrench($jd),PHP_EOL;//1/1/8
GregorianToJD()方法就是快捷地转换一个公历日期为jd计数。而jdtoxxxxx为些函数就是快速地返回jd计数对应的日期历法的字符串信息。
大家可以注意下,法历日期只能是公历年9月22日到年9月22日这段日期以内的日期,也就是法兰西第一共和国成立后推出的法历,并在年结束使用,因为年拿破仑成立了法兰西第一帝国。帝国废止了法历(共和历)并全面推行公历。
某个月份的天数上面的历史知识学习的怎么样?接下来还是回归到Calendar扩展中的学习中来。
$num=cal_days_in_month(CAL_GREGORIAN,2,);echo$num,PHP_EOL;//29
cal_days_in_month()函数是返回指定历法月份的天数,比如我们看看年的2月是不是闰月就可以用这个函数来实现。
复活节彩蛋复活节是西方非常重要的一个节日,所以在Calendar扩展中就有函数可以直接获得指定年份的复活节日期。关于复活节的计算方式其实还是比较复杂的,手工推算是比较麻烦的,而程序计算就非常方便了。
//指定年份的复活节时间戳echodate("M-d-Y",easter_date()),PHP_EOL;//Apr-21-echodate("M-d-Y",easter_date()),PHP_EOL;//Apr-12-echodate("M-d-Y",easter_date()),PHP_EOL;//Apr-04-//3月21日到复活节之间的天数echoeaster_days(),PHP_EOL;//31echoeaster_days(),PHP_EOL;//22echoeaster_days(),PHP_EOL;//14
easter_date()函数就是返回指定年份的复活节日期。而easter_days()函数则是返回从当年公历的3月21日到复活节之间的天数。
复活节是每年春分月圆后的第一个星期日,而春分一般是在3月21日,这就简化为只要计算满月的日期和紧挨的星期日的日期就可以得到每年复活节的具体日期了。这种函数在西方世界的软件开发中会非常常用,其实就像我们需要获取每年春节的具体公历日期一样。
总结是不是很有意思的一套扩展函数。不过对于我们主要面向国内开发的开发者来说用处确实不大,但笔者在学习这个扩展的时候另外收获了不少历史方面的知识,也算是开了眼界,也不失为一大收获,大家也自己试着玩玩并且查查相关的历史知识吧,说不定你的收获会更多!
测试代码: