在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,<<
