Как проверить, является ли год bisect (т.е. високосный год) в php?
PHP - Как проверить, является ли год делением пополам (т.е. Високосный год)?
Ответ 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 раз быстрее.