PHP中什么是Calendar扩展?如何使用?
Calendar是一套关于日期历法的扩展,在PHP中要如何使用该Calendar扩展?本篇文章给大家介绍一下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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。
