>  기사  >  백엔드 개발  >  PHP 국제 구성 요소에 국제 달력 클래스 소개

PHP 국제 구성 요소에 국제 달력 클래스 소개

藏色散人
藏色散人앞으로
2021-07-10 16:15:573444검색

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() 메서드를 사용하여 출력 내용의 형식을 지정할 수 있습니다. 지역 설정에 따라 다른 형식 지정 언어 결과가 표시됩니다.

Return timestamp

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입니다. getActualMaximum()은 실제 값을 반환합니다. 예를 들어 2020년 2월은 29일입니다. getMaximum()은 일반 월의 최대값인 31을 반환합니다. getActualMinimum() 및 getMinimum()은 실제 최소값과 일반 최소값을 반환합니다. 둘 다 해당 월에 대해 1이며 매월 1일은 확실히 1일입니다. getLeastMaximum() 메소드는 필드의 최소 로컬 최대값을 얻는 것입니다. 어떻게 이해합니까? 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'로 표시되는 현재 날짜는 주의 넷째 날인 주의 중간 목요일입니다(코드 타임을 실행하는 6월 30일을 지정하지 않았으므로, 수정 후 볼 수 있음), 이번 주는 이번 달의 다섯 번째 주이고, 이번 주는 전체 연도의 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주차입니다.

Calendar 비교

Calendar 개체 비교

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

이것은 상대적으로 간단합니다. Calendar 개체 내부의 속성은 다릅니다. 물론, equals() 메서드에서 반환된 결과는 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

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() 메소드의 첫 번째 매개변수는 달력으로만 고정할 수 있으며, 이어서 관련 영역을 채우고 반환되는 내용은 현재에서 지원하는 관련 내용입니다. 로케일 Word 값 정보입니다.

지역 언어 유형

$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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제