日の出/日の入り時刻と薄明 (twilight) の開始/終了時刻の情報を含む配列を返す

# date_sun_info

(PHP 5 >= 5.1.2, PHP 7, PHP 8)

date_sun_info — 日の出/日の入り時刻と薄明 (twilight) の開始/終了時刻の情報を含む配列を返す

### 説明

function date_sun_info(int `$timestamp`, float `$latitude`, float `$longitude`): array

### パラメータ

`timestamp`

  Unixタイムスタンプ。

`latitude`

  緯度を表す度数。

`longitude`

  経度を表す度数。

### 戻り値

配列を返します。配列の構造の詳細は、以下のリストのとおりです:

`sunrise`
  日の出のタイムスタンプ (天頂角 = 90°50' )
`sunset`
  日の入りのタイムスタンプ (天頂角 = 90°35' )
`transit`
  太陽が天頂に達するときのタイムスタンプ。 つまり、最高点に達する時刻です。
`civil_twilight_begin`
  日の出側の市民薄明 (夜明) が始まる時刻 (天頂角 = 96°)。 `sunrise` の時刻に終了します。
`civil_twilight_end`
  日の入り側の市民薄明 (夕暮) が終わる時刻 (天頂角 = 96°)。 `sunset` の時刻に始まります。
`nautical_twilight_begin`
  日の出側の航海薄明が始まる時刻 (天頂角 = 102°)。 `civil_twilight_begin` の時刻に終了します。
`nautical_twilight_end`
  日の入り側の航海薄明が終わる時刻 (天頂角 = 102°)。 `civil_twilight_end` の時刻に始まります。
`astronomical_twilight_begin`
  日の出側の天文薄明が始まる時刻 (天頂角 = 108°)。 `nautical_twilight_begin` の時刻に終了します。
`astronomical_twilight_end`
  日の入り側の天文薄明が終わる時刻 (天頂角 = 108°)。 `nautical_twilight_end` の時刻に始まります。

配列の要素の値は、UNIXタイムスタンプ、または 太陽が天頂より一日中下にある場合、`false` です。 また、一日中天頂より上にある場合、 `true` です。

### 変更履歴

バージョン | 説明
--- | ---
7.2.0 | ローカルの昼ではなく、 夜中に関する計算結果が修正されました。 これによって、結果が少し変わります。

### 例

例1 date_sun_info() の例

    <?php
    $sun_info = date_sun_info(strtotime("2006-12-12"), 31.7667, 35.2333);
    foreach ($sun_info as $key => $val) {
        echo "$key: " . date("H:i:s", $val) . "\n";
    }

上の例の出力は以下となります。

    sunrise: 05:52:11
    sunset: 15:41:21
    transit: 10:46:46
    civil_twilight_begin: 05:24:08
    civil_twilight_end: 16:09:24
    nautical_twilight_begin: 04:52:25
    nautical_twilight_end: 16:41:06
    astronomical_twilight_begin: 04:21:32
    astronomical_twilight_end: 17:12:00

例2 極夜のデータに処理を少し行う例

    <?php
    $tz = new \DateTimeZone('America/Anchorage');

    $si = date_sun_info(strtotime("2022-12-21"), 70.21, -148.51);
    foreach ($si as $key => $value) {
        echo
            match ($value) {
                true => 'always',
                false => 'never',
                default => date_create("@{$value}")->setTimeZone($tz)->format( 'H:i:s T' ),
            },
            ": {$key}",
            "\n";
    }

上の例の出力は以下となります。

    never: sunrise
    never: sunset
    12:52:18 AKST: transit
    10:53:19 AKST: civil_twilight_begin
    14:51:17 AKST: civil_twilight_end
    09:01:47 AKST: nautical_twilight_begin
    16:42:48 AKST: nautical_twilight_end
    07:40:47 AKST: astronomical_twilight_begin
    18:03:49 AKST: astronomical_twilight_end

例3 白夜の例(Tromsø, Norway)

    <?php
    $si = date_sun_info(strtotime("2022-06-26"), 69.68, 18.94);
    print_r($si);

上の例の出力は以下となります。

    Array
    (
        [sunrise] => 1
        [sunset] => 1
        [transit] => 1656240426
        [civil_twilight_begin] => 1
        [civil_twilight_end] => 1
        [nautical_twilight_begin] => 1
        [nautical_twilight_end] => 1
        [astronomical_twilight_begin] => 1
        [astronomical_twilight_end] => 1
    )

例4 一日の長さを計算する例 (Kyiv)

    <?php
    $si = date_sun_info(strtotime('2022-08-26'), 50.45, 30.52);
    $diff = $si['sunset'] - $si['sunrise'];
    echo "Length of day: ",
        floor($diff / 3600), "h ",
        floor(($diff % 3600) / 60), "s\n";

上の例の出力は以下となります。

    Length of day: 13h 56s

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open