本篇內(nèi)容介紹了“PHP中Calendar擴(kuò)展的原理和使用方法”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
那坡ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
Calendar是一套關(guān)于日期歷法的擴(kuò)展,但是對(duì)于我們來(lái)說(shuō),它沒有農(nóng)歷的相關(guān)操作,所以對(duì)于我們中國(guó)人來(lái)說(shuō)這個(gè)擴(kuò)展并沒有什么實(shí)際的作用。不過這并不妨礙我們?nèi)チ私鈱W(xué)習(xí)它。
日期歷法類型
對(duì)于正常情況下的日期操作來(lái)說(shuō),PHP 默認(rèn)使用的是 UTC 時(shí)間,也就是國(guó)際標(biāo)準(zhǔn)時(shí)間,對(duì)于我們國(guó)家來(lái)說(shuō),需要在標(biāo)準(zhǔn) UTC 的時(shí)間上加 8 來(lái)表示北京時(shí)間東八區(qū)。當(dāng)然,也可以直接修改 php.ini 或者數(shù)據(jù)庫(kù)中的時(shí)區(qū)相關(guān)參數(shù)來(lái)定義好日期時(shí)區(qū)。
標(biāo)準(zhǔn)時(shí)區(qū)對(duì)應(yīng)的其實(shí)就是格里高利時(shí)間歷法 Gregorian 。也就是我們現(xiàn)在最常用的公歷、陽(yáng)歷日期。Calendar 擴(kuò)展中除了這個(gè)標(biāo)準(zhǔn)的公歷歷法之外,還支持 猶太歷法 Jewish 、 法歷 French 以及另一個(gè)非常出名的 儒略歷 Julian 。我們的 Gregorian 歷法就是從 Julian 歷中演化而來(lái)的,它們的差距并不大,但 猶太歷 和 法歷 的差距就比較大了,一會(huì)在下面的代碼中我們將看到各種歷法之間的差別。
關(guān)于這些歷法的具體內(nèi)容大家可以自行查詢一下相關(guān)的資料,也能夠?qū)W習(xí)到一些有趣的歷史知識(shí),比如為什么廢棄了 儒略歷 而將公歷定為了 格里歷 。還有 法歷 為什么只有短短的那些年,猶太歷 為什么年份記得這么大了。法歷 和 猶太歷 月份名字的來(lái)源等,都是很有趣的故事。
Calendar 擴(kuò)展安裝及歷法信息查看
Calendar 擴(kuò)展已經(jīng)集成在 PHP 安裝包中了,不需要特別的單獨(dú)去安裝。如果你無(wú)法使用 Calendar 相關(guān)的函數(shù),可以重新編譯 PHP 并加上 --enable-calendar 參數(shù)即可。
接下來(lái)我們看下指定歷法的詳細(xì)信息,這里我們指定的是 猶太歷 。
$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() 函數(shù)接收的參數(shù)是一個(gè)常量,分別是 CAL_GREGORIAN ,CAL_JULIAN ,CAL_JEWISH ,CAL_FRENCH ,它們對(duì)應(yīng)的數(shù)字就是 0,1,2,3 。在這段代碼中,我們返回的就是 CAL_JEWISH 的信息??梢钥闯觯q太歷 中的月份名稱與公歷中的英文名稱都不一樣,比如這里有 尼撒月 Nisan 、提市黎月 Tishri 。具體的內(nèi)容就不深究了,畢竟我們?cè)谌粘I钪惺峭耆佑|不到這種歷法的。
大家可以自己試試其它歷法返回的信息內(nèi)容,公歷和儒略歷是一樣的,法歷中的月份名字就又不一樣了,而且這些名字還都很有意思。
日期歷法轉(zhuǎn)換
首先,要進(jìn)行歷法轉(zhuǎn)換的話,我們要將指定的日期轉(zhuǎn)換成 Julian Days 計(jì)數(shù)。這個(gè) jd 計(jì)數(shù)可以看作是 Calendar 擴(kuò)展的一個(gè)中間變量,用于各種歷法之間的換算。
// 轉(zhuǎn)變Unix時(shí)間戳為Julian Day計(jì)數(shù) $today = unixtojd(mktime(0, 0, 0, 9, 23, 2020)); echo $today, PHP_EOL; // 2459116
使用 unixtojd() 函數(shù)就可以將一個(gè) unix 時(shí)間戳轉(zhuǎn)換成 jd 計(jì)數(shù)。接下來(lái),我們看看 2020 年 9 月 23 號(hào)對(duì)應(yīng)的 猶太歷 是哪一天。
// 獲取當(dāng)前猶太歷時(shí)間 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 // )
返回的信息中已經(jīng)很明確了吧,我們這一天是 猶太歷 的 5781 年 1 月 5 號(hào) 星期三 。當(dāng)前的月份是 Tishri 提市黎月 ,對(duì)應(yīng)著公歷年的第一個(gè)月,猶太歷中教會(huì)年的第七個(gè)月,代表著秋天的到來(lái)。
cal_from_jd() 函數(shù)的作用就是根據(jù) jd計(jì)數(shù) 返回指定歷法的詳細(xì)信息。而另外一個(gè) cal_to_jd() 函數(shù)則是從一個(gè)支持的歷法數(shù)據(jù)轉(zhuǎn)換為 jd計(jì)數(shù) 。
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計(jì)數(shù) 和我們公歷返回的 jd計(jì)數(shù) 是一致的。
當(dāng)然,我們也可以將 jd計(jì)數(shù) 的日期轉(zhuǎn)換成 unix 時(shí)間。
echo date("Y-m-d", jdtounix($today)), PHP_EOL; // 2020-09-23
除了 cal_from_jd() 和 cal_to_jd() 之外,Calendar 擴(kuò)展還為我們提供了一些快捷的函數(shù)進(jìn)行日期的轉(zhuǎn)換,只不過它們是直接返回的字符串類型的日期信息,不是像 cal_from_jd() 函數(shù)一樣返回日期的詳細(xì)信息。
// 轉(zhuǎn)變一個(gè)Gregorian歷法日期到Julian Day計(jì)數(shù) $jd = GregorianToJD(9, 23, 2020); // 轉(zhuǎn)變一個(gè)Julian Day計(jì)數(shù)為Gregorian歷法日期 echo jdtogregorian($jd), PHP_EOL; // 9/23/2020 // 轉(zhuǎn)變一個(gè)Julian Day計(jì)數(shù)為Julian歷法日期 echo jdtojulian($jd), PHP_EOL; // 9/10/2020 // 轉(zhuǎn)變一個(gè)Julian Day計(jì)數(shù)為猶太歷法日期 echo jdtojewish($jd), PHP_EOL; // 1/5/5781 // 轉(zhuǎn)變一個(gè)Julian Day計(jì)數(shù)為unix時(shí)間戳 echo jdtounix($jd), PHP_EOL; // 1600819200 $jd = GregorianToJD(9, 23, 1799); // 轉(zhuǎn)變一個(gè)Julian Day計(jì)數(shù)為French歷法日期 echo jdtofrench($jd), PHP_EOL; // 1/1/8
GregorianToJD() 方法就是快捷地轉(zhuǎn)換一個(gè)公歷日期為 jd計(jì)數(shù) 。而 jdtoxxxxx 為些函數(shù)就是快速地返回 jd計(jì)數(shù) 對(duì)應(yīng)的日期歷法的字符串信息。
大家可以注意下,法歷 日期只能是公歷 1792年9月22日到1806年9月22日 這段日期以內(nèi)的日期,也就是 法蘭西第一共和國(guó) 成立后推出的 法歷 ,并在 1806年 結(jié)束使用,因?yàn)?1804年 拿破侖 成立了 法蘭西第一帝國(guó) 。帝國(guó)廢止了 法歷(共和歷)并全面推行 公歷 。
某個(gè)月份的天數(shù)
上面的歷史知識(shí)學(xué)習(xí)的怎么樣?接下來(lái)還是回歸到 Calendar 擴(kuò)展中的學(xué)習(xí)中來(lái)。
$num = cal_days_in_month(CAL_GREGORIAN, 2, 2020); echo $num, PHP_EOL; // 29
cal_days_in_month() 函數(shù)是返回指定歷法月份的天數(shù),比如我們看看 2020 年的 2月 是不是 閏月 就可以用這個(gè)函數(shù)來(lái)實(shí)現(xiàn)。
復(fù)活節(jié)彩蛋
復(fù)活節(jié)是西方非常重要的一個(gè)節(jié)日,所以在 Calendar 擴(kuò)展中就有函數(shù)可以直接獲得指定年份的復(fù)活節(jié)日期。關(guān)于復(fù)活節(jié)的計(jì)算方式其實(shí)還是比較復(fù)雜的,手工推算是比較麻煩的,而程序計(jì)算就非常方便了。
// 指定年份的復(fù)活節(jié)時(shí)間戳 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日到復(fù)活節(jié)之間的天數(shù) echo easter_days(2019), PHP_EOL; // 31 echo easter_days(2020), PHP_EOL; // 22 echo easter_days(2021), PHP_EOL; // 14
easter_date() 函數(shù)就是返回指定年份的復(fù)活節(jié)日期。而 easter_days() 函數(shù)則是返回從當(dāng)年公歷的 3月21日 到復(fù)活節(jié)之間的天數(shù)。
復(fù)活節(jié)是每年春分月圓后的第一個(gè)星期日,而春分一般是在3月21日,這就簡(jiǎn)化為只要計(jì)算滿月的日期和緊挨的星期日的日期就可以得到每年復(fù)活節(jié)的具體日期了。這種函數(shù)在西方世界的軟件開發(fā)中會(huì)非常常用,其實(shí)就像我們需要獲取每年春節(jié)的具體公歷日期一樣。
總結(jié)
是不是很有意思的一套擴(kuò)展函數(shù)。不過對(duì)于我們主要面向國(guó)內(nèi)開發(fā)的開發(fā)者來(lái)說(shuō)用處確實(shí)不大,但筆者在學(xué)習(xí)這個(gè)擴(kuò)展的時(shí)候另外收獲了不少歷史方面的知識(shí),也算是開了眼界,也不失為一大收獲,大家也自己試著玩玩并且查查相關(guān)的歷史知識(shí)吧,說(shuō)不定你的收獲會(huì)更多!
測(cè)試代碼:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/10.PHP中非常好玩的Calendar擴(kuò)展學(xué)習(xí).php
參考文檔:https://www.php.net/manual/zh/book.calendar.php
“PHP中Calendar擴(kuò)展的原理和使用方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!