当前位置: 首页> 最新文章列表> 如何让 date_sunset() 支持国际化显示时间

如何让 date_sunset() 支持国际化显示时间

M66 2025-06-04

在 PHP 中,date_sunset() 函数可以根据经纬度和日期计算出日落时间。它返回的是一个 UNIX 时间戳或者格式化好的时间字符串。然而,这个函数本身并不直接支持多语言输出或者不同的国际化(i18n)时间格式。那么,如何让 date_sunset() 支持多语言和本地化显示呢?本文将一步步带你实现。

1. 基础用法回顾

首先了解一下 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);
?>

上面的代码会输出日落时间,但时间格式是固定的,需要手动格式化。而且没有考虑语言环境。

2. 改造成支持多语言和国际化时间格式

要做到多语言和国际化,我们可以结合使用 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”(法语格式)。

3. 动态切换语言示例

如果你的网站允许用户选择语言,比如从 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,就会看到德语格式的日落时间。

4. 小技巧:格式定制

如果你想完全自定义输出格式,比如只显示小时分钟,可以进一步指定自定义模式:

$formatter = new IntlDateFormatter(
    'zh_CN',
    IntlDateFormatter::NONE,
    IntlDateFormatter::NONE,
    'Asia/Shanghai',
    IntlDateFormatter::GREGORIAN,
    'HH:mm'
);

这段设置会输出像 18:45 这样的时间格式,非常适合移动端或需要简洁界面的时候。

总结

  • date_sunset() 本身不支持多语言和国际化,但可以结合 IntlDateFormatter 使用。

  • 记得正确设置 localetimezone

  • 允许用户动态切换语言能大大提升用户体验。

只要理解了这一点,类似的日期时间函数(比如 date_sunrise())也可以用同样的方式国际化。