在 php 的国际化组件中,还有一个我们并不是很常用的日期操作类,它就是日历操作类。说是日历,其实大部分还是对日期时间的操作,一般也是主要用于日期的格式化和比较之类的。但是通常我们直接使用 date 相关的函数或者 datetime 相关的类操作日期相关的功能,反而比这套功能更方便灵活。当然,本着学习的目的,我们还是来简单地了解一下。 首先还是从格式化时间说起。 IntlCalendar 类的 createInstance() 方法会返回一个 IntlCalendar 对象,它的参数是可选的,不过必须是 TimeZone 类型的参数。fromDateTime() 方法同样也是生成一个 IntlCalendar 对象,不过它可以设置一个 DateTime 对象或者日期类型的字符串为参数。 可以看到,我们返回的对象使用 get_class() 方法后看到实际返回的是一个 IntlGregorianCalendar 格林格里日历对象。这时,就可以使用 IntlDateFormatter 类的 formatObject() 方法来格式化输出内容,它是可以指定地区的,不同的地区设置就会显示不同的格式化语言结果。 不多做解释了,不过这个静态方法返的是带毫秒数的时间戳。 立即学习“PHP免费学习笔记(深入)”; 只要是国际化相关的功能,都多少和时区 TimeZone 有关,日历类也不例外。 使用 getTimeZone() 就可以获得当前的时区信息,getLocale() 和之前我们文章中其它相关功能类的 getLocale() 方法没有什么区别,大家可以看下之前讲过的内容。当然,这个 TimeZone 属性除了通过 ini_set() 之外,也是可以直接通过对象的 setTimeZone() 方法进行修改的。 这是什么意思呢?先看下代码。 楼上这一堆是什么鬼?其实这几个方法就是返回的指定参数字段内容的最大、最小值,比如我们查看的是 FIELD_DAY_OF_MONTH ,也就是月份有多少天。getActualMaximum() 返回的是实际值,比如 2020 年的 2 月份是有 29 天的 。getMaximum() 返回的是正常月份的最大值,都是 31 。getActualMinimum() 、getMinimum() 返回的是实际最小值和正常最小值,这个对于月份来说都是 1 ,每个月都肯定会有 1 天。getLeastMaximum() 方法是获取字段的最小局部最大值,怎么理解呢?2月份最小天数是28天,它的局部最大值也就是28天,其它月份则分 30 和 31 天。 这个功能主要是可以设置一周的起始日期是周几。比如对于欧美的国际标准时间来说,周一并不是一周的开始,周日才是这一周的第一天。大家从各种日历应用中就能发现这个问题。 在当前的时区中,我们 getFirstDayOfWeek() 返回的结果是 1 ,也就是周一为一周的起点,周几是从 0 开始计算的。set() 方法可以设置具体的日期,需要注意月份也是从 0 开始的。我们再使用 IntlDateFormatter::formatObject() 输出当前日期在周几、在月中的第几周以及当前周是今年的第几周。在这里我们设置的是 2020年的 6 月 30 号,'cc' 表示的当前日期在周中是周四,是一周中的第四天(不是指定的6月30号,是我们运行代码时的时间,方便我们修改后查看),当前周是在当前月是第五周,当前周在整年里的是第 27 周。如果我们改变这个每周开始的时间呢? 嗯,'cc' 变为 1 了,当前成为了周一。现在是在当前月份的第 6 周了,因为我们现在一周的开始是从周四开始算的啦。 IEStore是一款B2C独立网上商店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。IEStore网上商店系统不仅在产品功能、稳定性、安全性和SEO支持(搜索引擎优化)等方面具有在同类产品领先地位,重要的是在功能架构上、操作上符合国际化标准,成为国际化电子商务的最佳软件选择之一。功能概要国际化标准IEStore网上商店系统是一个带有多国 这个比较简单,日历对象内部的属性不同,当然 equals() 方法返回的结果就是 false 了。 除了比较日历对象外,还可以获取两个日历时间之前的差值信息。 可以看到使用 fieldDifference() 方法就可以获得日历对象和比较日期之间相关的信息。需要注意的是,使用 fieldDifference() 之后,原来的日历对象全变成新的日期信息。 getKeywordValuesForLocale() 方法的第一个参数只能固定写 calendar ,后面是填写相关的区域,返回的内容就是当前语言环境下所支持的相关字值信息。 很明显,getType() 方法返回的就是指定语言区域信息的类型。 使用 roll() 方法可以滚动或者说是卷动日历,在这里我们将日历滚动一天,也就是加了一天的时间。 使用 toDateTime() 方法就可以将当前的 IntlCalendar 对象转换成 DateTime 对象。 getAvailableLocales() 返回的是当前系统中所有支持可用的 Locale 信息。 关于日历类其实还有很多方法函数,但是看得人非常头晕,英文解释不多,资料也不清晰,所以这里就是简单的列举了一些内容。大家还是报以学习的心态了解即可,当需要使用到的时候可以快速地想起还这些功能就可以了。 推荐学习:《PHP视频教程》格式化时间
$cal = IntlCalendar::createInstance(IntlTimeZone::getGMT());
var_dump(get_class($cal), IntlDateFormatter::formatObject($cal, IntlDateFormatter::FULL));
// string(21) "IntlGregorianCalendar"
// string(66) "2020年11月18日星期三 格林尼治标准时间 上午12:58:14"
$cal1 = IntlCalendar::fromDateTime('2013-02-28 00:01:02 Europe/Berlin');
var_dump(get_class($cal1), IntlDateFormatter::formatObject($cal1, 'yyyy MMMM d HH:mm:ss VVVV', 'de_DE'));
// string(21) "IntlGregorianCalendar"
// string(41) "2013 Februar 28 00:01:02 Deutschland Zeit"返回时间戳
echo IntlCalendar::getNow(), PHP_EOL; // 1605661094417
时区相关设置
ini_set('intl.default_locale', 'de_DE');
ini_set('date.timezone', 'Europe/Berlin');
$cal = IntlCalendar::createInstance();
print_r($cal->getTimeZone());
// IntlTimeZone Object
// (
// [valid] => 1
// [id] => Europe/Berlin
// [rawOffset] => 3600000
// [currentOffset] => 3600000
// )
echo $cal->getLocale(Locale::ACTUAL_LOCALE), PHP_EOL; // de
echo $cal->getLocale(Locale::VALID_LOCALE), PHP_EOL; // de_DEini_set('intl.default_locale', 'zh_CN');
ini_set('date.timezone', 'Asia/Shanghai');
$cal = IntlCalendar::createInstance();
print_r($cal->getTimeZone());
// IntlTimeZone Object
// (
// [valid] => 1
// [id] => Asia/Shanghai
// [rawOffset] => 28800000
// [currentOffset] => 28800000
// )
$cal->setTimeZone('UTC');
print_r($cal->getTimeZone());
// IntlTimeZone Object
// (
// [valid] => 1
// [id] => UTC
// [rawOffset] => 0
// [currentOffset] => 0
// )
echo $cal->getLocale(Locale::ACTUAL_LOCALE), PHP_EOL; // zh
echo $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)); //29
var_dump($cal->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH)); //31
var_dump($cal->getActualMinimum(IntlCalendar::FIELD_DAY_OF_MONTH)); //1
var_dump($cal->getMinimum(IntlCalendar::FIELD_DAY_OF_MONTH)); //1
var_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)); //28
var_dump($cal->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH)); //31
var_dump($cal->getActualMinimum(IntlCalendar::FIELD_DAY_OF_MONTH)); //1
var_dump($cal->getMinimum(IntlCalendar::FIELD_DAY_OF_MONTH)); //1
var_dump($cal->getLeastMaximum(IntlCalendar::FIELD_DAY_OF_MONTH));// 28一周的起始日期
$cal = IntlCalendar::createInstance();
$cal->set(2020, 5, 30);
var_dump($cal->getFirstDayOfWeek()); // 1
echo IntlDateFormatter::formatObject($cal, <<<EOD
'local day of week: 'cc'
week of month : 'W'
week of year : 'ww
EOD
), PHP_EOL;
// local day of week: 3
// week of month : 5
// week of year : 27
$cal->setFirstDayOfWeek(3);
var_dump($cal->getFirstDayOfWeek()); // int(5)
echo IntlDateFormatter::formatObject($cal, <<<EOD
'local day of week: 'cc'
week of month : 'W'
week of year : 'ww
EOD
), PHP_EOL;
// local day of week: 1
// week of month : 6
// week of year : 27
日历比较
日历对象比较
$cal1 = IntlCalendar::createInstance();
$cal2 = IntlCalendar::createInstance();
var_dump($cal1->equals($cal2)); // bool(true)
$cal2->setTime($cal1->getTime() + 1);
var_dump($cal1->equals($cal2)); // bool(false)
日历对象差值
$cal1 = IntlCalendar::fromDateTime('2019-1-29 09:00:11');
$cal2 = IntlCalendar::fromDateTime('2020-03-01 09:19:29');
$time = $cal2->getTime();
echo "之前的时间: ", IntlDateFormatter::formatObject($cal1), "\n";
// 之前的时间: 2019年1月29日 上午9:00:11
printf(
"两个时间的差别: %d year(s), %d month(s), "
. "%d day(s), %d hour(s) and %d minute(s)\n",
$cal1->fieldDifference($time, IntlCalendar::FIELD_YEAR),
$cal1->fieldDifference($time, IntlCalendar::FIELD_MONTH),
$cal1->fieldDifference($time, IntlCalendar::FIELD_DAY_OF_MONTH),
$cal1->fieldDifference($time, IntlCalendar::FIELD_HOUR_OF_DAY),
$cal1->fieldDifference($time, IntlCalendar::FIELD_MINUTE)
);
// 两个时间的差别: 1 year(s), 1 month(s), 1 day(s), 0 hour(s) and 19 minute(s)
echo "之后的时间: ", IntlDateFormatter::formatObject($cal1), "\n";
// 之后的时间: 2020年3月1日 上午9:19:11其它信息
查看区域设置关键字值集
print_r(iterator_to_array(IntlCalendar::getKeywordValuesForLocale('calendar', 'zh_CN', true)));
// Array
// (
// [0] => gregorian
// [1] => chinese
// )
print_r(iterator_to_array(IntlCalendar::getKeywordValuesForLocale('calendar', 'zh_CN', false)));
// Array
// (
// [0] => gregorian
// [1] => chinese
// [2] => japanese
// [3] => buddhist
// [4] => roc
// [5] => persian
// [6] => islamic-civil
// [7] => islamic
// [8] => hebrew
// [9] => indian
// [10] => coptic
// [11] => ethiopic
// [12] => ethiopic-amete-alem
// [13] => iso8601
// [14] => dangi
// [15] => islamic-umalqura
// [16] => islamic-tbla
// [17] => islamic-rgsa
// )区域语言类型
$cal = IntlCalendar::createInstance(NULL, '@calendar=ethiopic-amete-alem');
var_dump($cal->getType());
// string(19) "ethiopic-amete-alem"
$cal = new IntlGregorianCalendar();
var_dump($cal->getType());
// string(9) "gregorian"
滚动日历
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) "2020年11月19日 上午9:14:59"
转换为 DateTime 对象
var_dump($cal->toDateTime());
// object(DateTime)#4 (3) {
// ["date"]=>
// string(26) "2020-11-19 09:14:59.000000"
// ["timezone_type"]=>
// int(3)
// ["timezone"]=>
// string(13) "Asia/Shanghai"
// }当前系统中支持的所有区域信息
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
// ……
// ……
总结
0
0
相关文章
关联数组遍历怎么用_PHP foreach遍历关联数组【教程】
PHP框架如何输出JSON_新手API接口返回JSON数据方法【操作】
PHP框架数据库连接失败_连接错误与配置检查方法【指南】
PHP 数组求前 N 项和算法
PHP代码怎么在命令行运行_PHP CLI模式使用指南【教程】
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
Java Video类是JavaFX库中的一个类,用于创建和操作视频对象。它提供了方法来加载、播放、暂停、停止和控制视频的音量、速度和循环等属性。想了解更多Java中类的相关内容,可以阅读本专题下面的文章。
325
2024.02.29
js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。
760
2023.08.03
js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。
221
2023.09.04
java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。
1566
2023.10.24
字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。
649
2023.11.24
Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。
1228
2024.03.22
本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。
3
2026.03.11
热门下载
相关下载
精品课程
最新文章



