当前位置: 首页> 最新文章列表> 与 sun_info()(自定义函数)组合输出更多日照信息

与 sun_info()(自定义函数)组合输出更多日照信息

M66 2025-06-02

在 PHP 中,date_sunset() 是一个非常实用的函数,用于根据日期和地理位置计算日落时间。然而,单独使用 date_sunset() 往往只能获取有限的信息,比如仅返回日落时间。为了获取更全面的日照信息(如日出、日落、太阳正午、日照时长等),我们可以封装一个自定义函数 sun_info() 来整合 date_sun_info()date_sunset() 的能力,输出更丰富的太阳相关数据。

下面,我们将展示如何实现 sun_info() 函数,并结合 date_sunset() 获取并输出详细的日照信息。

基础知识:date_sunset()date_sun_info()

首先,简单介绍两个关键函数的用途:

  • date_sunset():获取指定时间和地理位置的日落时间。

  • date_sun_info():返回一个数组,包含日出、日落、黄昏、黎明、太阳正午等详细信息。

虽然 date_sun_info() 的功能更全面,但我们可以利用 date_sunset() 的可配置性(如不同的 zenith 角度)来获取更精细的数据。

自定义函数:sun_info()

我们编写一个函数 sun_info(),该函数接受日期、经度、纬度和时区作为参数,返回一个结构化数组,包含如下信息:

  • 日出时间

  • 日落时间

  • 日照长度(单位:分钟)

  • 太阳正午时间

  • 黄昏(civil dusk)时间

  • 黎明(civil dawn)时间

function sun_info($date, $latitude, $longitude, $timezone = 'UTC') {
    $timestamp = strtotime($date);

    $sunData = date_sun_info($timestamp, $latitude, $longitude);
    $sunset = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude);
    $sunrise = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude);

    $daylightMinutes = round(($sunset - $sunrise) / 60);

    // 转换为指定时区格式化输出
    $dtZone = new DateTimeZone($timezone);
    $format = function($ts) use ($dtZone) {
        if (!$ts || $ts < 0) return 'N/A';
        $dt = new DateTime("@$ts");
        $dt->setTimezone($dtZone);
        return $dt->format('H:i:s');
    };

    return [
        'sunrise'     => $format($sunData['sunrise']),
        'sunset'      => $format($sunData['sunset']),
        'solar_noon'  => $format($sunData['solar_noon']),
        'civil_dawn'  => $format($sunData['civil_twilight_begin']),
        'civil_dusk'  => $format($sunData['civil_twilight_end']),
        'day_length'  => $daylightMinutes . ' 分钟',
    ];
}

示例使用

假设你希望获取北京在 2025 年 4 月 26 日的日照信息,可以这样调用:

$info = sun_info('2025-04-26', 39.9042, 116.4074, 'Asia/Shanghai');

echo "北京今日太阳信息:<br>";
foreach ($info as $label => $value) {
    echo ucfirst(str_replace('_', ' ', $label)) . ': ' . $value . '<br>';
}

输出示例可能如下:

Beijing 今日太阳信息:
Sunrise: 05:21:32  
Sunset: 18:57:20  
Solar noon: 12:09:26  
Civil dawn: 04:53:10  
Civil dusk: 19:25:42  
Day length: 456 分钟

拓展应用:前端展示与链接集成

为了更直观地展示这些日照信息,可以结合 JavaScript 或图表库进一步美化输出效果。你还可以在页面上集成一个链接,例如:

echo '<a href="https://m66.net/sun?lat=39.9&lon=116.4&date=2025-04-26">查看更多日照详情</a>';