PHP Conference Japan 2024

IntlTimeZone 类

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

简介

类概要

class IntlTimeZone {
/* 常量 */
public const int DISPLAY_SHORT;
public const int DISPLAY_LONG;
public const int DISPLAY_SHORT_GMT;
public const int DISPLAY_LONG_GMT;
public const int TYPE_ANY;
public const int TYPE_CANONICAL;
/* 方法 */
private __construct()
public static countEquivalentIDs(string $timezoneId): int|false
public static createDefault(): IntlTimeZone
public static createEnumeration(IntlTimeZone|string|int|float|null $countryOrRawOffset = null): IntlIterator|false
public static createTimeZone(string $timezoneId): ?IntlTimeZone
public static createTimeZoneIDEnumeration(int $type, ?string $region = null, ?int $rawOffset = null): IntlIterator|false
public static fromDateTimeZone(DateTimeZone $timezone): ?IntlTimeZone
public static getCanonicalID(string $timezoneId, bool &$isSystemId = null): string|false
public getDisplayName(bool $dst = false, int $style = IntlTimeZone::DISPLAY_LONG, ?string $locale = null): string|false
public getDSTSavings(): int
public static getEquivalentID(string $timezoneId, int $offset): string|false
public static getGMT(): IntlTimeZone
public getID(): string|false
public static getIDForWindowsID(string $timezoneId, ?string $region = null): string|false
public getOffset(
    float $timestamp ,
    bool $local ,
    int &$rawOffset,
    int &$dstOffset
): bool
public getRawOffset(): int
public static getRegion(string $timezoneId): string|false
public static getTZDataVersion(): string|false
public static getUnknown(): IntlTimeZone
public static getWindowsID(string $timezoneId): string|false
}

变更日志

版本 描述
8.4.0 类常量现在已添加类型。

目录

添加笔记

用户贡献笔记 1 条笔记

2
匿名用户
6 年前
目前没有关于 IntlTimeZone::parse() 的文档,所以花了一些时间才找到一个可行的示例

<?php
// 32位PHP 7.0.30版本(Intl版本1.1,ICU版本56.1)示例
// 要获取包含夏令时的日期偏移量,getRawOffset()函数是不够的,需要使用getOffset()函数。
// 并且需要一个日期来考虑历史因素。

\Locale::setDefault('nl-NL');
$date = '25-03-2018 12:34:56.123456 CEST'; // 2月3日
$timezone = \IntlTimeZone::createDefault(); // = CEST = GMT +02:00
print '时区: ' . $timezone->getDisplayName() . PHP_EOL;
print
'夏令时: ' . ($timezone->useDaylightTime() ? '启用' : '未启用')
.
' 此时区' . PHP_EOL;
print
'可能的夏令时差异 (微妙): ' . $timezone->getDSTSavings() . PHP_EOL;

$formatter = new \IntlDateFormatter(
\Locale::getDefault(),
\IntlDateFormatter::MEDIUM,
\IntlDateFormatter::MEDIUM,
$timezone
);
$timestamp = $formatter->parse($date);
if (
FALSE === $timestamp) {
throw new
\Exception('无法解析日期');
}
elseif (
is_float($timestamp)) {
throw new
\Exception('32位系统存在Y2K38错误,请使用64位系统');
}
print
'IntlFormatter::parse() 解析的日期: ' . date('c', $timestamp)
.
PHP_EOL;

$cal = \IntlCalendar::createInstance();
$cal->setTimeZone($timezone);
$cal->setLenient(FALSE);
// 设置UNIX时间戳偏移量 (1970-01-01 00:00:00.000000) 并添加时间戳
$cal->set(1970, 0, 1, 0, 0, 0);
$cal->set(\IntlCalendar::FIELD_MILLISECOND, 0); // 注意:毫秒,而不是微秒
$cal->add(\IntlCalendar::FIELD_SECOND, $timestamp); // 注意:没有毫秒
$cal->add(\IntlCalendar::FIELD_MILLISECOND, 124); // 为简便起见硬编码

header('Content-type: text/plain');
print
'使用IntlCalendar构建的日期: ' . $formatter->format($cal)
.
PHP_EOL;
print
'getRawOffset() 获取的原始偏移量: ' . $timezone->getRawOffset() . PHP_EOL;

/**
* IntlTimeZone::getOffset() 函数
* @link http://icu-project.org/apiref/icu4c/classicu_1_1TimeZone.html#afcbc1c48bf0b453b0123c4cb75d20e96
* @param float $date
* 要返回偏移量的时刻,单位为自 1970 年 1 月 1 日 0:00 GMT 起的毫秒数,
* 根据`local`参数的值,可以是 GMT 时间或本地时间。
* @param bool $local
* 如果为 true,则 `date` 为本地时间;否则为 GMT 时间。
* @param int &$rawOffset
* 输出参数,用于接收原始偏移量,即不包含夏令时调整的偏移量
* @param int &$dstOffset
* 输出参数,用于接收夏令时偏移量,即要添加到 `rawOffset` 中的值,
* 以获得本地时间和 GMT 时间之间的总偏移量。如果夏令时未生效,则此值为零;
* 否则它是一个正值,通常为一小时。
*/

$rawOffset = NULL;
$dstOffset = NULL;
$timestamp *= 1000.0; // 将unix时间戳从秒转换为毫秒
$timezone->getOffset($timestamp, $local = FALSE, $rawOffset, $dstOffset);
print
'getOffset() 的输出结果:' . PHP_EOL . json_encode([
'rawOffset' => $rawOffset,
'dstOffset' => $dstOffset
], JSON_PRETTY_PRINT) . PHP_EOL;
?>
To Top