在 PHP 中,date_sunset() 函数可以根据经纬度和日期计算出日落时间。它返回的是一个 UNIX 时间戳或者格式化好的时间字符串。然而,这个函数本身并不直接支持多语言输出或者不同的国际化(i18n)时间格式。那么,如何让 date_sunset() 支持多语言和本地化显示呢?本文将一步步带你实现。
首先了解一下 date_sunset() 的基本用法:
<?php
$timestamp = strtotime('2025-04-26');
$latitude = 37.7749; // 例如:旧金山
$longitude = -122.4194;
$sunset = date_sunset(
$timestamp,
SUNFUNCS_RET_TIMESTAMP,
$latitude,
$longitude,
90,
0
);
echo date('H:i:s', $sunset);
?>
上面的代码会输出日落时间,但时间格式是固定的,需要手动格式化。而且没有考虑语言环境。
要做到多语言和国际化,我们可以结合使用 PHP 的 IntlDateFormatter 类,这是 intl 扩展提供的强大工具。
首先,确保你的服务器安装了 intl 扩展。如果没有,可以参考这里安装:https://www.m66.net/php-intl-install-guide
下面是完整改进版的代码示例:
<?php
$timestamp = strtotime('2025-04-26');
$latitude = 37.7749; // 纬度
$longitude = -122.4194; // 经度
// 获取日落时间戳
$sunset = date_sunset(
$timestamp,
SUNFUNCS_RET_TIMESTAMP,
$latitude,
$longitude,
90,
0
);
// 设定语言和地区,例如法语法国
$locale = 'fr_FR'; // 可以改成 'zh_CN'、'en_US'、'de_DE' 等
// 设定时区
$timezone = 'Europe/Paris'; // 根据需要设定正确时区
// 创建格式化器
$formatter = new IntlDateFormatter(
$locale,
IntlDateFormatter::FULL,
IntlDateFormatter::SHORT,
$timezone,
IntlDateFormatter::GREGORIAN
);
// 格式化日落时间
$localizedSunset = $formatter->format($sunset);
echo "日落时间(本地化): " . $localizedSunset;
?>
locale 控制输出的语言,比如中文、法语、德语等。
timezone 控制输出的时区,确保时间正确。
IntlDateFormatter 可以根据语言习惯自动格式化日期,比如把“26 April 2025”变成“26 avril 2025”(法语格式)。
如果你的网站允许用户选择语言,比如从 URL 参数里传语言代码,可以这样做:
<?php
$locale = isset($_GET['lang']) ? $_GET['lang'] : 'en_US';
$formatter = new IntlDateFormatter(
$locale,
IntlDateFormatter::FULL,
IntlDateFormatter::SHORT,
'UTC',
IntlDateFormatter::GREGORIAN
);
$sunset = date_sunset(
strtotime('2025-04-26'),
SUNFUNCS_RET_TIMESTAMP,
37.7749,
-122.4194,
90,
0
);
echo $formatter->format($sunset);
?>
如果访问:https://www.m66.net/sunset.php?lang=de_DE,就会看到德语格式的日落时间。
如果你想完全自定义输出格式,比如只显示小时分钟,可以进一步指定自定义模式:
$formatter = new IntlDateFormatter(
'zh_CN',
IntlDateFormatter::NONE,
IntlDateFormatter::NONE,
'Asia/Shanghai',
IntlDateFormatter::GREGORIAN,
'HH:mm'
);
这段设置会输出像 18:45 这样的时间格式,非常适合移动端或需要简洁界面的时候。
date_sunset() 本身不支持多语言和国际化,但可以结合 IntlDateFormatter 使用。
记得正确设置 locale 和 timezone。
允许用户动态切换语言能大大提升用户体验。
只要理解了这一点,类似的日期时间函数(比如 date_sunrise())也可以用同样的方式国际化。