Подтвердить что ты не робот

PHP - Как проверить, является ли год делением пополам (т.е. Високосный год)?

Как проверить, является ли год bisect (т.е. високосный год) в php?

4b9b3361

Ответ 1

Вы можете использовать функцию PHP date(), чтобы сделать это...

// L will return 1 or 0 for leap years
echo date('L');

// use your own timestamp
echo date('L', strtotime('last year'));

// for specific year
$year = 1999;
$leap = date('L', mktime(0, 0, 0, 1, 1, $year));
echo $year . ' ' . ($leap ? 'is' : 'is not') . ' a leap year.';

Дайте мне знать, если это поможет вам, Cheers!

UPDATE: Добавлен пример для конкретного года

Ответ 2

A bisect year - другое название для високосного года. Используйте форматер L, где $year - год, который вы тестируете:

echo (date('L', strtotime("$year-01-01")) ? 'Yes' : 'No');

Чтобы настроить несоответствие между календарь и сезоны, юлиан календарь использовал расчеты Греческий астроном Сосиген и был на основе принятия 365,25 дней год: 3 года 365 дней, за которыми следует 366 дней в году, дополнительный день добавляется всегда после 24-го Февраль (sexto ante календари Martiis = шестой день до мартовских календарей), называемый bis sexto ( шестой день бис), следовательно, имена bisect year и bisect day для високосный день. Год был разделен на 12 месяцев, которые чередовались 31 и 30 дней и февраля, в нормальных лет, 29 дней и 30 дней в bisect года.

Позже, когда восьмой месяц посвященный императору Августу (Август), в этом месяце было сделано 31 дней в июле, месяц посвященный Юлию Цезарю. Вот почему Февраль состоял из 28 дней, имея 29 дней в биссектные годы.

http://news.softpedia.com/news/The-History-of-Modern-Calendar-and-Bisect-Year-79892.shtml

Ответ 3

Используя DateTime класс:

$year = 2000;
$isLeap = DateTime::createFromFormat('Y', $year)->format('L') === "1";
var_dump($isLeap); // bool(true)

Ответ 4

function is_leap_year($year)
{
    return ((($year % 4) == 0) && ((($year % 100) != 0) || (($year %400) == 0)));
}

Ответ 5

Проблема проверки, является ли год високосным, если используется юлианский или григорианский календарь.

Между тем год в юлианском календаре имеет 365,25, год в григорианском календаре - 365,2422. Итак, григорианский год на 11 минут короче юлианского. И общее правило для високосных лет (год /4 должно быть целым числом) недействительно во все времена.

Year/4
Year/100 & Year/400

Так что большинство лет, когда год /100 не являются високосными.

Также есть еще одно важное условие для этой проверки.

Year >= 1583

Поскольку григорианский календарь был предписан к использованию в 1582 году, и на этот год повлияли изменения, вызванные началом использования этого календаря (четверг 4 октября, а затем 15 октября - дни между днями были удалены), 1583 - это первый год, который исчисляется как полностью григорианский (в григорианском календаре). Но я решил не проверять это условие, так как это условие должно быть проверено перед проверкой високосного года - если он не уверен, что год считается в соответствии с григорианским календарем.


Для обоих календарей можно написать собственную функцию (или автономный статический метод), и результат должен быть таким же, как если бы использовался класс PHP.

А также, использование вашей собственной функции/метода потребует более короткого кода.

public static function Is_LeapYear($Year = 1583)
{
    $LeapYear = FALSE;

    if(CheckTypes::Is_Integer($Year / 4))
    {
        if(CheckTypes::Is_Integer($Year / 100) && !CheckTypes::Is_Integer($Year / 400))
        {
            $LeapYear = FALSE;
        }
        else
        {
            $LeapYear = TRUE;
        }
    }
    else
    {
        $LeapYear = FALSE;
    }

    return $LeapYear;
}

CheckTypes - это мой собственный класс для проверки нескольких типов (в противном случае методы позволяют выполнять проверку нескольких типов). Is_Integer (из-за проверки одного типа) равен is_integer из встроенных функций PHP. Таким образом, CheckTypes::Is_Integer($Year/4) можно заменить на is_integer($Year/4) и результат будет таким же.

Этот подсчет високосного года соответствует григорианскому календарю, а не юлианскому.

Ответ 6

Если вы заботитесь о производительности, более быстрый способ:

!($year % 4) && ($year % 100 || !($year % 400))

Он возвращает точно такой же результат, чем:

(bool) date('L', mktime(0, 0, 0, 1, 1, $year))

С 101 по 999999, но это примерно в 30 раз быстрее.