首頁 後端開發 php教程 PHP中什麼是Calendar擴充?如何使用?

PHP中什麼是Calendar擴充?如何使用?

Jun 28, 2021 pm 06:35 PM
php

Calendar是一套關於日期曆法的擴展,在PHP中要如何使用該Calendar擴展?這篇文章為大家介紹Calendar 擴充安裝和使用方法。

PHP中什麼是Calendar擴充?如何使用?

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

推荐学习:《PHP视频教程

以上是PHP中什麼是Calendar擴充?如何使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles