目前没有可用的 IntlTimeZone::parse() 文档,因此花了一些时间才弄清楚一个可行的示例
<?php
\Locale::setDefault('nl-NL');
$date = '25-03-2018 12:34:56.123456 CEST'; $timezone = \IntlTimeZone::createDefault(); 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);
$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;
$rawOffset = NULL;
$dstOffset = NULL;
$timestamp *= 1000.0; $timezone->getOffset($timestamp, $local = FALSE, $rawOffset, $dstOffset);
print 'getOffset() 的输出: ' . PHP_EOL . json_encode([
'rawOffset' => $rawOffset,
'dstOffset' => $dstOffset
], JSON_PRETTY_PRINT) . PHP_EOL;
?>