Maison  >  Article  >  développement back-end  >  Introduction d'une classe de calendrier international dans le composant international PHP

Introduction d'une classe de calendrier international dans le composant international PHP

藏色散人
藏色散人avant
2021-07-10 16:15:573479parcourir

Dans les composants internationalisés de PHP, il existe également une classe d'opérations de date que nous n'utilisons pas couramment, qui est la classe d'opérations de calendrier. On dit qu'il s'agit d'un calendrier, mais en fait, la majeure partie fonctionne toujours sur la date et l'heure et est généralement principalement utilisée pour le formatage et la comparaison des dates. Mais généralement, nous utilisons directement des fonctions liées à la date ou des classes liées à DateTime pour exécuter des fonctions liées à la date, ce qui est plus pratique et flexible que cet ensemble de fonctions. Bien sûr, dans un but d’apprentissage, jetons-y un bref coup d’œil.

Temps de formatage

Commençons d’abord par le temps de formatage.

$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"

La méthode createInstance() de la classe IntlCalendar renverra un objet IntlCalendar. Ses paramètres sont facultatifs, mais doivent être de type TimeZone. La méthode fromDateTime() génère également un objet IntlCalendar, mais elle peut définir un objet DateTime ou une chaîne de type date comme paramètre.

Vous pouvez voir qu'après avoir utilisé la méthode get_class() sur l'objet renvoyé, nous pouvons voir que ce qui est réellement renvoyé est un objet de calendrier grégorien IntlGregorianCalendar. À ce stade, vous pouvez utiliser la méthode formatObject() de la classe IntlDateFormatter pour formater le contenu de sortie. Elle peut spécifier la région. Différents paramètres régionaux afficheront différents résultats de langue de formatage.

Retour de l'horodatage

echo IntlCalendar::getNow(), PHP_EOL; // 1605661094417

Je n'expliquerai pas grand-chose, mais cette méthode statique renvoie un horodatage en millisecondes.

Paramètres liés au fuseau horaire

Tant que les fonctions liées à l'internationalisation sont liées au fuseau horaire TimeZone, la classe calendrier ne fait pas exception.

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_DE

Utilisez getTimeZone() pour obtenir les informations de fuseau horaire actuel. getLocale() n'est pas différent de la méthode getLocale() d'autres classes fonctionnelles associées dans notre article précédent. Bien entendu, en plus de ini_set(), cette propriété TimeZone peut également être modifiée directement via la méthode setTimeZone() de l'objet.

ini_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

Opérations liées au calendrier

Informations sur les valeurs maximales et minimales du champ horaire

Qu'est-ce que cela signifie ? Regardons d'abord le code.

$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

C'est quoi cette pile à l'étage ? En fait, ces méthodes renvoient les valeurs maximales et minimales du contenu du champ de paramètre spécifié. Par exemple, ce que nous examinons est FIELD_DAY_OF_MONTH, qui correspond au nombre de jours dans le mois. getActualMaximum() renvoie la valeur réelle. Par exemple, février 2020 compte 29 jours. getMaximum() renvoie la valeur maximale du mois normal, qui est 31. getActualMinimum() et getMinimum() renvoient la valeur minimale réelle et la valeur minimale normale, qui sont toutes deux égales à 1 pour le mois, et il y aura certainement 1 jour dans chaque mois. La méthode getLeastMaximum() consiste à obtenir la valeur maximale locale minimale du champ. Comment le comprendre ? Le nombre minimum de jours en février est de 28 jours et son maximum local est de 28 jours, tandis que les autres mois ont 30 et 31 jours.

Date de début de la semaine

Cette fonction permet principalement de régler le jour de la semaine auquel se situe la date de début de la semaine. Par exemple, pour l’heure standard internationale en Europe et aux États-Unis, le lundi n’est pas le début de la semaine, mais le dimanche est le premier jour de la semaine. Vous pouvez rencontrer ce problème dans diverses applications de calendrier.

$cal = IntlCalendar::createInstance();
$cal->set(2020, 5, 30);
var_dump($cal->getFirstDayOfWeek()); // 1
echo IntlDateFormatter::formatObject($cal, <<<EOD
&#39;local day of week: &#39;cc&#39;
week of month    : &#39;W&#39;
week of year     : &#39;ww
EOD
), PHP_EOL;
// local day of week: 3
// week of month    : 5
// week of year     : 27

Dans le fuseau horaire actuel, le résultat renvoyé par notre getFirstDayOfWeek() est 1, c'est-à-dire que lundi est le point de départ de la semaine et le jour de la semaine est calculé à partir de 0. La méthode set() peut définir une date spécifique. Veuillez noter que le mois commence également à 0. Nous utilisons ensuite IntlDateFormatter::formatObject() pour afficher le jour de la semaine, la semaine du mois et la semaine de l'année en cours. Ici, nous définissons le 30 juin 2020. La date actuelle représentée par « cc » est le jeudi au milieu de la semaine, qui est le quatrième jour de la semaine (et non le 30 juin spécifié, qui est le moment où nous exécutons l'heure du code, donc que nous pouvons la visualiser après modification), la semaine en cours est la cinquième semaine du mois en cours, et la semaine en cours est la 27ème semaine de l'année entière. Et si on changeait l'heure de début de cette semaine ?

$cal->setFirstDayOfWeek(3);
var_dump($cal->getFirstDayOfWeek());  // int(5)
echo IntlDateFormatter::formatObject($cal, <<<EOD
&#39;local day of week: &#39;cc&#39;
week of month    : &#39;W&#39;
week of year     : &#39;ww
EOD
), PHP_EOL;
// local day of week: 1
// week of month    : 6
// week of year     : 27

Eh bien, 'cc' est devenu 1 et nous sommes lundi maintenant. Nous sommes désormais la semaine 6 du mois en cours, puisque nous commençons désormais la semaine jeudi.

Comparaison de calendrier

Comparaison d'objets de calendrier

$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)

C'est relativement simple. Les attributs internes de l'objet calendrier sont bien sûr différents, le résultat renvoyé par la méthode equals() est faux.

Différence d'objet de calendrier

En plus de comparer des objets de calendrier, vous pouvez également obtenir les informations de différence entre deux heures de calendrier.

$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

Vous pouvez voir que l'utilisation de la méthode fieldDifference() peut obtenir les informations pertinentes entre l'objet calendrier et la date de comparaison. Il convient de noter qu'après avoir utilisé fieldDifference(), tous les objets du calendrier d'origine deviennent de nouvelles informations de date.

Autres informations

Afficher l'ensemble de valeurs de mot-clé local

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
// )

Le premier paramètre de la méthode getKeywordValuesForLocale() ne peut être fixé que sur le calendrier, suivi du remplissage des zones pertinentes, et le contenu renvoyé est celui pertinent pris en charge par le courant paramètres régionaux Informations sur la valeur du mot.

Type de langue régionale

$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"

Évidemment, la méthode getType() renvoie le type des informations sur la région linguistique spécifiée.

滚动日历

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"

使用 roll() 方法可以滚动或者说是卷动日历,在这里我们将日历滚动一天,也就是加了一天的时间。

转换为 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"
//   }

使用 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 信息。

总结

关于日历类其实还有很多方法函数,但是看得人非常头晕,英文解释不多,资料也不清晰,所以这里就是简单的列举了一些内容。大家还是报以学习的心态了解即可,当需要使用到的时候可以快速地想起还这些功能就可以了。

推荐学习:《PHP视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer