PHP检查时间是否介于日落和日出之间

PHP检查时间是否介于日落和日出之间,php,time,Php,Time,我在这里已经讨论了很多问题和答案,但我似乎无法理解。 我主要是想检查在某个时间某个地点(lat/lng)是否是夜间 到目前为止,我设法获得了特定位置的日出和日落时间,然后我试图将其与当前时间进行比较。我有一点灰姑娘的情况,它工作良好,直到午夜罢工 我正在创建用于比较的变量,如下所示: $currenttime = DateTime::createFromFormat('Y-m-d H:i', $templooptime); $sunsettime = DateTime::cre

我在这里已经讨论了很多问题和答案,但我似乎无法理解。 我主要是想检查在某个时间某个地点(lat/lng)是否是夜间

到目前为止,我设法获得了特定位置的日出和日落时间,然后我试图将其与当前时间进行比较。我有一点灰姑娘的情况,它工作良好,直到午夜罢工

我正在创建用于比较的变量,如下所示:


    $currenttime = DateTime::createFromFormat('Y-m-d H:i', $templooptime);
    $sunsettime = DateTime::createFromFormat('Y-m-d H:i', $sunsetfinal);
    $sunrisetime = DateTime::createFromFormat('Y-m-d H:i', $sunrisefinal);
    if ($currenttime>$sunsettime) {
       $nightminutes++;
    }
我正在做一个简单的IF语句,如下所示:


    $currenttime = DateTime::createFromFormat('Y-m-d H:i', $templooptime);
    $sunsettime = DateTime::createFromFormat('Y-m-d H:i', $sunsetfinal);
    $sunrisetime = DateTime::createFromFormat('Y-m-d H:i', $sunrisefinal);
    if ($currenttime>$sunsettime) {
       $nightminutes++;
    }
这将产生以下结果:

Current Time:2020-09-22 23:58:00| Location: 50.1776906598,-51.077228098126 | Sunset Start: 2020-09-22 18:48:00 |Sunrise Start: 2020-09-22 06:45:00 | Night:287
Current Time:2020-09-22 23:59:00| Location: 50.202093865458,-50.984342445684 | Sunset Start: 2020-09-22 18:47:00 |Sunrise Start: 2020-09-22 06:44:00 | Night:288
Current Time:2020-09-23 00:00:00| Location: 50.226422634856,-50.891362177619 | Sunset Start: 2020-09-23 18:45:00 |Sunrise Start: 2020-09-23 06:46:00 | Night:0
Current Time:2020-09-23 00:01:00| Location: 50.25067682914,-50.798287405434 | Sunset Start: 2020-09-23 18:44:00 |Sunrise Start: 2020-09-23 06:45:00 | Night:0
当我将逻辑更改为:

if ($currenttime>$sunsettime && $currenttime<$sunrisetime) {
    $nightminutes++;
}
有没有办法解决这个问题?任何帮助都将不胜感激

更新根据RO的回答将日落时间设置为提前一天,仍然存在以下问题:

Current Time:2020-09-22 23:59:00 | Location: 50.202093865458,-50.984342445684 | Sunset Start: 2020-09-22 18:47:00 | Sunrise Start: 2020-09-23 06:46:00 | Night:288
Current Time:2020-09-23 00:00:00 | Location: 50.226422634856,-50.891362177619 | Sunset Start: 2020-09-23 18:45:00 | Sunrise Start: 2020-09-24 06:47:00 | Night:0
当它穿过午夜时,日落时间小于当前时间,因此显示为false。有什么想法吗

更新2这是我正在使用的基本代码(摘录):


您已将日出时间计算为日落之前

有关说明,请参见此示例:

<?php

$today = new DateTime;
$randomAfternoonTime = (clone $today)->setTime(13, 25);
$randomNightTime = (clone $today)->add(new DateInterval('P1D'))->setTime(2, 23);

// Times relevant to Amsterdam on 2020-09-23.
// Sunset happens this evening.
$sunsetTime = (clone $today)->setTime(19, 36);
// Sunrise happens tomorrow, so add one day.
$sunriseTime = (clone $today)->add(new DateInterval('P1D'))->setTime(7, 30);

echo "Sunset at:\n" . $sunsetTime->format('Y-m-d H:i') . "\n\n";
echo "Sunrise at:\n" . $sunriseTime->format('Y-m-d H:i') . "\n\n";

echo "Some time in the afternoon (NOT in between sunset/sunrise):\n" . $randomAfternoonTime->format('Y-m-d H:i') . "\n\n";
echo "At night (in between sunset/sunrise):\n" . $randomNightTime->format('Y-m-d H:i') . "\n\n";

// Shows bool(false): 13:25 is not in between sunset/sunrise.
var_dump($randomAfternoonTime->getTimestamp() > $sunsetTime->getTimestamp() && $randomAfternoonTime->getTimestamp() < $sunriseTime->getTimestamp());

// Shows bool(true): 02:23 is in between sunset/sunrise.
var_dump($randomNightTime->getTimestamp() > $sunsetTime->getTimestamp() && $randomNightTime->getTimestamp() < $sunriseTime->getTimestamp());

啊,我明白了!那么,我应该在当前时间的基础上加上一天,然后计算第二天的日出吗?是的。您可以在接受
DateInterval
对象的
DateTime
对象上使用
add
方法。它的构造函数接受一个字符串。您很可能想要
P1D
。请将我的答案标记为“接受”,如果有帮助的话:“完美。”真不敢相信我怎么会错过这个,非常感谢Ro,真的很感激。刚刚尝试过,同样的问题在午夜后发生,因为日出时间比当前时间长。我故意让我的添加有点冗长,所以你可以看到步骤。他们应该相当自我评价。您可以将此逻辑插入到代码中,这样您就可以开始了。如果它有效,请考虑将我的答案标记为“接受:”
<?php

$referenceDateTime = new DateTime('2020-09-22 23:58:00');

$coordinates =
    [
        [ 50.1776906598, -51.077228098126 ],
        [ 50.202093865458, -50.984342445684 ],
        [ 50.226422634856, -50.891362177619 ],
        [ 50.25067682914, -50.798287405434 ]
    ];

foreach ($coordinates as $coordinate)
{
    [ $lat, $long ] = $coordinate;

    $sunsetDateTime = (clone $referenceDateTime)->setTimestamp(date_sunset($referenceDateTime->getTimestamp(), SUNFUNCS_RET_TIMESTAMP, $lat, $long, 90, 2));
    $sunriseDateTime = (clone $referenceDateTime)->setTimestamp(date_sunrise((clone $referenceDateTime)->add(new DateInterval('P1D'))->getTimestamp(), SUNFUNCS_RET_TIMESTAMP, $lat, $long, 90, 2));
    
    $daySegment = ($referenceDateTime > $sunsetDateTime && $referenceDateTime < $sunriseDateTime)?'night':'day';
    
    echo "Current Time: {$referenceDateTime->format('Y-m-d H:i:s')}\nLocation: $lat, $long\nSunset Start: {$sunsetDateTime->format('Y-m-d H:i:s')}\nSunrise Start: {$sunriseDateTime->format('Y-m-d H:i:s')}\nNight or day? : $daySegment\n\n";
    
    $referenceDateTime->add(new DateInterval('PT1M'));
}
<?php

$referenceHour = 22;
$referenceMinute = 31;

$sunsetHour = 23;
$sunsetMinute = 50;

$sunriseHour = 7;
$sunriseMinute = 30;

$referenceHour -= ($referenceHour < 12)?-12:12;
$sunsetHour -= ($sunsetHour < 12)?-12:12;
$sunriseHour -= ($sunriseHour < 12)?-12:12;

$referenceTime = ($referenceHour * 60) + $referenceMinute;
$sunsetTime = ($sunsetHour * 60) + $sunsetMinute;
$sunriseTime = ($sunriseHour * 60) + $sunriseMinute;

$daySegment = ($referenceTime >= $sunsetTime && $referenceTime <= $sunriseTime)?'night':'day';

echo "Reference time: " . sprintf('%02d:%02d', $referenceHour, $referenceMinute) . ", sunset time: " . sprintf('%02d:%02d', $sunsetHour, $sunsetMinute) . ", sunrise time: " . sprintf('%02d:%02d', $sunriseHour, $sunriseMinute) . ", night/day: $daySegment\n";