PHP программа, чтобы найти мой день рождения, где день имени «понедельник» еще на 100 лет - PullRequest
4 голосов
/ 13 июня 2011

Я родился в 1986-04-21, в понедельник.Мой следующий день рождения с названием «Понедельник» - 1997-04-21 и т. Д.

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

Это код:

<?php
date_default_timezone_set('Asia/Calcutta');
for($year = 1986; $year < 2086; $year++) {
    $timestamp = mktime(0, 0, 0, 4, 21, $year);
    if(date('l', $timestamp) == 'Monday') {
        echo date('Y-m-d, l', $timestamp) . "\n";
    }
}
?>

Это вывод программы:

1986-04-21, Monday
1997-04-21, Monday
2003-04-21, Monday
2008-04-21, Monday
2014-04-21, Monday
2025-04-21, Monday
2031-04-21, Monday
2036-04-21, Monday

Теперь моя проблема в том, почему PHP не поддерживал до 1970 года и после 2040 года.
Так как я могу получить день рождения после 2040 года или до 1970 года?

Ответы [ 3 ]

7 голосов
/ 13 июня 2011

Нет необходимости использовать какие-либо специальные классы или функции обработки даты.

Ваш день рождения наступает после високосного дня в феврале, поэтому от года к следующему он будет либо на один день (365% 7), либо (в високосные годы) на два дня позже (366% 7) позже это был год до этого.

$year = 1985; // start year
$dow = 0;     // 0 for 1985-04-21 (Sunday)

while ($year < 2100) {

    $year++; $dow++;

    if ($year % 4 == 0 && ($year % 100 != 0 || $year % 400 == 0)) {
       $dow++; // leap year
    }

    $dow %= 7;      // normalise back to Sunday -> Saturday
    if ($dow == 1) {
        printf("%04d-%02d-%02d is a Monday\n", $year, 4, 21);
    }
}

Этот код будет работать на любой версии PHP.

5 голосов
/ 13 июня 2011

Если вы используете PHP 5.3, вы можете использовать класс DateTime и добавить DateInterval s.Он основан на 64-разрядных целых числах и не имеет проблемы год 2038 .

Базовый пример:

<?php

$year = DateInterval::createFromDateString('1 year'); 

$date = new DateTime('1986-04-21');
$date->add($year);
echo $date->format('Y-m-d') . "\n";  // Repeat 100 times

документация по createFromDateString() равна здесь .

1 голос
/ 13 июня 2011

По той причине, что вы не можете пойти до 1970 или после 2038 года, см. Руководство по датам :

Допустимый диапазон отметок времени обычно от пт, 13 декабря1901 20:45:54 по Гринвичу, вторник, 19 января 2038 года, 03:14:07 по Гринвичу.(Это даты, которые соответствуют минимальным и максимальным значениям для 32-разрядного целого числа со знаком).Однако до PHP 5.1.0 этот диапазон был ограничен с 01-01-1970 до 19-01-2038 в некоторых системах (например, Windows).

...