PHP时区处理与夏令时问题
PHP时区处理与夏令时问题
时区处理是全球化应用的常见问题。夏令时让时间计算变得更复杂。今天说说PHP中时区和夏令时的处理。
设置默认时区。
```php
date_default_timezone_set('Asia/Shanghai');
echo date('Y-m-d H:i:s') . "\n";
ini_set('date.timezone', 'Asia/Shanghai');
echo date_default_timezone_get() . "\n";
?>
不同时区的转换。
```php
$date = new DateTime('now', new DateTimeZone('Asia/Shanghai'));
echo "北京时间: " . $date->format('Y-m-d H:i:s') . "\n";
$date->setTimezone(new DateTimeZone('America/New_York'));
echo "纽约时间: " . $date->format('Y-m-d H:i:s') . "\n";
$date->setTimezone(new DateTimeZone('Europe/London'));
echo "伦敦时间: " . $date->format('Y-m-d H:i:s') . "\n";
$date->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo "东京时间: " . $date->format('Y-m-d H:i:s') . "\n";
?>
时区偏移量。
```php
function getTimezoneOffset(string $timezone): string
{
$tz = new DateTimeZone($timezone);
$offset = $tz->getOffset(new DateTime()) / 3600;
$sign = $offset >= 0 ? '+' : '-';
$hours = abs((int)$offset);
$minutes = abs(($offset - (int)$offset) * 60);
return "UTC{$sign}{$hours}:{$minutes}";
}
echo "上海: " . getTimezoneOffset('Asia/Shanghai') . "\n";
echo "纽约: " . getTimezoneOffset('America/New_York') . "\n";
echo "伦敦: " . getTimezoneOffset('Europe/London') . "\n";
?>
夏令时的检测。
```php
function isDaylightSaving(string $timezone, string $date = 'now'): bool
{
$tz = new DateTimeZone($timezone);
$dt = new DateTime($date, $tz);
$transitions = $tz->getTransitions($dt->getTimestamp(), $dt->getTimestamp());
return !empty($transitions) && $transitions[0]['isdst'];
}
echo "纽约现在是否夏令时: " . (isDaylightSaving('America/New_York') ? '是' : '否') . "\n";
echo "伦敦现在是否夏令时: " . (isDaylightSaving('Europe/London') ? '是' : '否') . "\n";
echo "上海是否夏令时: " . (isDaylightSaving('Asia/Shanghai') ? '是' : '否') . "\n";
?>
存储UTC时间,显示时转换。
```php
// 数据库存储UTC
function storeUtc(): DateTime
{
return new DateTime('now', new DateTimeZone('UTC'));
}
function displayInTimezone(DateTime $utcDate, string $timezone): string
{
$local = clone $utcDate;
$local->setTimezone(new DateTimeZone($timezone));
return $local->format('Y-m-d H:i:s');
}
$utcNow = storeUtc();
echo "UTC: " . $utcNow->format('Y-m-d H:i:s') . "\n";
echo "北京: " . displayInTimezone($utcNow, 'Asia/Shanghai') . "\n";
echo "纽约: " . displayInTimezone($utcNow, 'America/New_York') . "\n";
?>
可用时区列表。
```php
$timezones = DateTimeZone::listIdentifiers();
echo "支持的时区数: " . count($timezones) . "\n";
echo "亚洲: " . implode(', ', array_slice(preg_grep('/^Asia\//', $timezones), 0, 10)) . "...\n";
echo "欧洲: " . implode(', ', array_slice(preg_grep('/^Europe\//', $timezones), 0, 10)) . "...\n";
?>
时区处理的最佳实践。数据库存储UTC时间,显示时根据用户时区转换。不要依赖服务器默认时区,显式指定时区。避免直接使用时间戳做日期运算。使用DateTime和DateTimeZone类处理时区相关操作。
更多推荐
所有评论(0)