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

PHP国际化日历类

时间:2023-03-30 01:29:49 PHP

在PHP国际化组件中,还有一个我们不太常用的日期操作类,就是日历操作类。说到日历,其实大部分都是对日期和时间的操作,一般用于日期的格式化和比较。但是通常我们直接使用日期相关的函数或者DateTime相关的类来操作日期相关的函数,比这套函数更方便灵活。当然,为了学习,还是简单看一下吧。格式化时间首先,让我们从格式化时间开始。$cal=IntlCalendar::createInstance(IntlTimeZone::getGMT());var_dump(get_class($cal),IntlDateFormatter::formatObject($cal,IntlDateFormatter::FULL));//字符串(21)"IntlGregorianCalendar"//string(66)"格林威治标准时间2020年11月18日星期三12:58:14"$cal1=IntlCalendar::fromDateTime('2013-02-2800:01:02Europe/Berlin');var_dump(get_class($cal1),IntlDateFormatter::formatObject($cal1,'yyyyMMMMdHH:mm:ssVVVV','de_DE'));//string(21)"IntlGregorianCalendar"//string(41)"2013年二月28日00:01:02DeutschlandZeit"IntlCalendar类的createInstance()方法返回一个IntlCalendar对象,它的参数是可选的,但必须是TimeZone类型。fromDateTime()方法也会生成一个IntlCalendar对象,但它可以设置一个DateTime对象或日期类型的字符串作为参数。可以看到,我们返回的对象使用了get_class()方法,可以看到实际返回的是一个IntlGregorianCalendar公历对象。这时候可以使用IntlDateFormatter类的formatObject()方法对输出内容进行格式化。可以指定区域,不同的区域设置会显示不同的格式化语言结果。返回时间戳echoIntlCalendar::getNow(),PHP_EOL;//1605661094417不多解释,这个静态方法返回一个时间戳,以毫秒为单位。时区相关的设置只要是国际化相关的功能,都或多或少与时区TimeZone有关,日历类也不例外。ini_set('intl.default_locale','de_DE');ini_set('date.timezone','欧洲/柏林');$cal=IntlCalendar::createInstance();print_r($cal->getTimeZone());//IntlTimeZone对象//(//[valid]=>1//[id]=>Europe/Berlin//[rawOffset]=>3600000//[currentOffset]=>3600000//)echo$cal->getLocale(Locale::ACTUAL_LOCALE),PHP_EOL;//deecho$cal->getLocale(Locale::VALID_LOCALE),PHP_EOL;//de_DE可以通过getTimeZone()、getLocale()和我们之前文章中其他相关功能类的getLocale()方法获取当前时区信息,大家可以阅读前面提到的内容。当然,这个TimeZone属性除了通过ini_set()之外,还可以直接通过对象的setTimeZone()方法来修改。ini_set('intl.default_locale','zh_CN');ini_set('date.timezone','亚洲/上海');$cal=IntlCalendar::createInstance();print_r($cal->getTimeZone());//IntlTimeZone对象//(//[valid]=>1//[id]=>Asia/Shanghai//[rawOffset]=>28800000//[currentOffset]=>28800000//)$cal->setTimeZone('UTC');print_r($cal->getTimeZone());//IntlTimeZone对象//(//[valid]=>1//[id]=>UTC//[rawOffset]=>0//[currentOffset]=>0//)echo$cal->getLocale(Locale::ACTUAL_LOCALE),PHP_EOL;//zhecho$cal->getLocale(Locale::VALID_LOCALE),PHP_EOL;//zh_Hans_CN日历相关操作时间字段最大最小值相关信息什么意思?先看代码。$cal=IntlCalendar::fromDateTime('2020-02-15');var_dump($cal->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));//29var_dump($cal->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));//31var_dump($cal->getActualMinimum(IntlCalendar::FIELD_DAY_OF_MONTH));//1var_dump($cal->getMinimum(IntlCalendar::FIELD_DAY_OF_MONTH));//1var_dump($cal->getLeastMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));//28$cal->add(IntlCalendar::FIELD_EXTENDED_YEAR,-1);var_dump($cal->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));//28var_dump($cal->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));//31var_dump($cal->getActualMinimum(IntlCalendar::FIELD_DAY_OF_MONTH));//1var_dump($cal->getMinimum(IntlCalendar::FIELD_DAY_OF_MONTH));//1var_dump($cal->getLeastMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));//28楼上这一堆是什么鬼?其实这些方法都是返回指定参数字段内容的最大值和最小值。例如,我们正在查看FIELD_DAY_OF_MONTH,即该月有多少天。getActualMaximum()返回实际值,例如2020年2月有29天。getMaximum()返回正常月份的最大值,即31。getActualMinimum()和getMinimum()返回实际最小值和正常最小值。这是一个月的1,每个月必须有1天。getLeastMaximum()方法是获取字段的最小局部最大值,怎么理解呢?2月的天数最少为28天,其局部最大天数为28天,其他月份分为30天和31天。一周开始日期功能主要是设置一周的开始日期。例如欧美国家的国际标准时间,周一不是一周的开始,周日是一周的第一天。您可以从各种日历应用程序中看到此问题。$cal=IntlCalendar::createInstance();$cal->set(2020,5,30);var_dump($cal->getFirstDayOfWeek());//1echoIntlDateFormatter::formatObject($cal,<<setFirstDayOfWeek(3);var_dump($cal->getFirstDayOfWeek());//int(5)echoIntlDateFormatter::formatObject($cal,<<equals($cal2));//bool(true)$cal2->setTime($cal1->getTime()+1);var_dump($cal1->equals($cal2));//bool(false)比较简单,日历对象内部属性不同,当然equals()方法返回的结果是false。日历对象差异除了比较日历对象,还可以得到两个日历时间之前的差异信息。$cal1=IntlCalendar::fromDateTime('2019-1-2909:00:11');$cal2=IntlCalendar::fromDateTime('2020-03-0109:19:29');$time=$cal2->getTime();echo"之前时间:",IntlDateFormatter::formatObject($cal1),"\n";//之前时间:2019年1月29日上午9:00:11printf("两次之差:%d年,%d月,"."%d天,%d小时和%d分钟\n",$cal1->fieldDifference($time,IntlCalendar::FIELD_YEAR),$cal1->fieldDifference($time,IntlCalendar::FIELD_MONTH),$cal1->fieldDifference($time,IntlCalendar::FIELD_DAY_OF_MONTH),$cal1->fieldDifference($time,国际日历::FIELD_HOUR_OF_DAY),$cal1->fieldDifference($time,IntlCalendar::FIELD_MINUTE));//两次相差:1年,1个月,1天,0小时,19分钟(s)echo"Timeafter:",IntlDateFormatter::formatObject($cal1),"\n";//Timeafter:2020年3月1日上午9:19:11可以看到使用fieldDifference()方法来获取有关日历对象和比较日期的信息。需要注意的是,使用fieldDifference()后,原来的日历对象都会变成新的日期信息。其他信息查看locale关键字值设置print_r(iterator_to_array(IntlCalendar::getKeywordValuesForLocale('calendar','zh_CN',true)));//Array//(//[0]=>grgorian//[1]=>chinese//)print_r(iterator_to_array(IntlCalendar::getKeywordValuesForLocale('calendar','zh_CN',false)));//数组//(//[0]=>grgorian//[1]=>chinese//[2]=>japanese//[3]=>buddhist//[4]=>roc//[5]=>persian//[6]=>islamic-civil//[7]=>islamic//[8]=>希伯来语//[9]=>印度语//[10]=>科普特语//[11]=>埃塞俄比亚语//[12]=>ethiopic-amete-alem//[13]=>iso8601//[14]=>dangi//[15]=>islamic-umalqura//[16]=>islamic-tbla//[17]=>islamic-rgsa//)getKeywordValuesForLocale()方法第一个参数即可只写成固定日历,后面填写相关字段,返回内容为当前语言环境支持的相关词值信息。区域语言类型$cal=IntlCalendar::createInstance(NULL,'@calendar=ethiopic-amete-alem');var_dump($cal->getType());//string(19)"ethiopic-amete-alem"$cal=newIntlGregorianCalendar();var_dump($cal->getType());//string(9)"gregorian"显然,getType()方法返回指定语言区域信息的类型。滚动日历var_dump(IntlDateFormatter::formatObject($cal));//string(31)"2020年11月18日上午9:14:59"$cal->roll(IntlCalendar::FIELD_DAY_OF_MONTH,true);var_dump(IntlDateFormatter::formatObject($cal));//string(31)"November19,20209:14:59AM"使用roll()方法滚动或滚动日历,这里我们将日历滚动一天,即增加一天。转换为DateTime对象var_dump($cal->toDateTime());//object(DateTime)#4(3){//["date"]=>//string(26)"2020-11-1909:14:59.000000"//["timezone_type"]=>//int(3)//["timezone"]=>//string(13)"Asia/Shanghai"//}使用toDateTime()方法设置当前的IntlCalendar对象被转换为DateTime对象。当前系统支持的所有区域信息print_r(IntlCalendar::getAvailableLocales());//Array//(//[0]=>af//[1]=>af_NA//[2]=>af_ZA//[3]=>agq//[4]=>agq_CM//[5]=>ak//[6]=>ak_GH//[7]=>am//[8]=>am_ET//[9]=>ar//...//...getAvailableLocales()返回当前系统支持和可用的所有locale信息,总结一下,关于日历类的方法和函数其实很多,但是很晕看到了,而且英文解释不多,资料不是很清楚,所以这里简单罗列了一些内容,大家还是可以抱着学习的态度看懂的,需要用到的时候可以快速的记住返回这些功能。测试代码:参考文档:https://www.php.net/manual/zh/class.intlcalendar.php各媒体平台均可搜索【硬核项目经理】