PHP 国際コンポーネントに国際カレンダー クラスを導入

藏色散人
リリース: 2023-04-10 10:54:01
転載
3497 人が閲覧しました

PHP の国際化コンポーネントには、あまり使用しない日付操作クラスもあります。これは、カレンダー操作の種類です。 。カレンダーと言われていますが、実際にはそのほとんどが日付と時刻で動作し、一般的には主に日付の書式設定と比較に使用されます。ただし、通常は、日付関連関数または DateTime 関連クラスを直接使用して、日付関連関数を操作します。これは、この一連の関数よりも便利で柔軟です。もちろん、学習のために簡単に見てみましょう。

フォーマット時間

まず、フォーマット時間から始めましょう。

$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"
ログイン後にコピー

IntlCalendar クラスの createInstance() メソッドは IntlCalendar オブジェクトを返します。そのパラメーターはオプションですが、TimeZone 型である必要があります。 fromDateTime() メソッドも IntlCalendar オブジェクトを生成しますが、DateTime オブジェクトまたは日付型の文字列をパラメータとして設定できます。

ご覧のとおり、返されたオブジェクトに対して get_class() メソッドを使用すると、実際に返されるのは IntlGregorianCalendar グレゴリオ暦オブジェクトであることがわかります。このとき、IntlDateFormatter クラスの formatObject() メソッドを使用して出力コンテンツを書式設定できます。地域を指定できます。地域設定が異なると、表示される書式言語の結果も異なります。

タイムスタンプを返す

echo IntlCalendar::getNow(), PHP_EOL; // 1605661094417
ログイン後にコピー

詳しくは説明しませんが、この静的メソッドはミリ秒単位のタイムスタンプを返します。

タイムゾーン関連の設定

国際化関連の関数がタイムゾーン TimeZone に関連している限り、カレンダー クラスも例外ではありません。

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
ログイン後にコピー

getTimeZone() を使用して、現在のタイム ゾーン情報を取得します。getLocale() と、前の記事で説明した他の関連関数クラスの getLocale() メソッドの間に違いはありません。私たちは前にも言いました。もちろん、ini_set() に加えて、この TimeZone プロパティはオブジェクトの setTimeZone() メソッドを通じて直接変更することもできます。

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
ログイン後にコピー

カレンダー関連の操作

時間フィールドの最大値と最小値関連の情報

これは何を意味しますか?まずはコードを見てみましょう。

$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
ログイン後にコピー

上の階にあるこの束は一体何ですか?実際、これらのメソッドは、指定されたパラメーター フィールドの内容の最大値と最小値を返します。たとえば、ここで調べているのは、その月の日数である FIELD_DAY_OF_MONTH です。 getActualMinimum() は実際の値を返します。たとえば、2020 年 2 月は 29 日です。 getMinimum() は、通常の月の最大値である 31 を返します。 getActualMinimum() と getMinimum() は実際の最小値と通常の最小値を返します。これらはどちらもその月の 1 であり、各月には必ず 1 日があります。 getLeastMinimum() メソッドは、フィールドの最小極大値を取得することを目的としています。 2 月の最小日数は 28 日、ローカル最大日数は 28 日ですが、他の月には 30 日と 31 日があります。

週の開始日

この関数は主に、週の開始日が何曜日であるかを設定するために使用されます。たとえば、ヨーロッパと米国の国際標準時間では、月曜日が週の始まりではなく、日曜日が週の始まりになります。この問題はさまざまなカレンダー アプリケーションで発生します。

$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
ログイン後にコピー

現在のタイムゾーンでは、getFirstDayOfWeek() によって返される結果は 1 です。つまり、月曜日が週の開始点であり、曜日は 0 から計算されます。 set() メソッドでは特定の日付を設定できますが、月も 0 から始まることに注意してください。次に、IntlDateFormatter::formatObject() を使用して、曜日、月の週、および今年の週を出力します。ここでは、2020 年 6 月 30 日を設定します。「cc」で表される現在の日付は、週の真ん中の木曜日、つまり週の 4 日目です (コードを実行するときに指定された 6 月 30 日ではありません)。変更後に表示できることを示します)、今週は今月の第 5 週であり、今年全体では第 27 週です。今週の開始時間を変更したらどうなりますか?

$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
ログイン後にコピー

さて、「cc」が 1 になり、現在は月曜日です。週は木曜日から始まるので、今月は第 6 週目に入ります。

カレンダーの比較

カレンダー オブジェクトの比較

$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)
ログイン後にコピー

これは比較的単純です。カレンダー オブジェクト内のプロパティは異なります。もちろん、equals() メソッドによって返される結果です。は誤りです。

カレンダー オブジェクトの差異

カレンダー オブジェクトの比較に加えて、2 つのカレンダー時刻間の差異情報を取得することもできます。

$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
ログイン後にコピー

fieldDifference() メソッドを使用すると、カレンダー オブジェクトと比較日付に関連する情報を取得できることがわかります。 fieldDifference()を使用すると、元のカレンダーオブジェクトはすべて新しい日付情報になることに注意してください。

その他の情報

地域設定キーワード値セットの表示

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
// )
ログイン後にコピー

getKeywordValuesForLocale() メソッドの最初のパラメータはカレンダーにのみ固定でき、その後に、返される内容は、現在の言語環境でサポートされている関連する単語値情報です。

地域言語タイプ

$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"
ログイン後にコピー

明らかに、 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) "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视频教程

以上がPHP 国際コンポーネントに国際カレンダー クラスを導入の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート