|
|
|
| Здравствуйте, есть скрипт, который формирует календарные месяцы на промежутке дат. Проблема только в том, что если разница в промежутке больше чем два года, то скрипт почему-то неправильно работает... Помогите пожалуйста. Запустите ниже скрипт и увидете как правильно должно быть.
<?
$period_row['date1'] = "2012-07-18";
$period_row['date2'] = "2014-09-26";
$time = strtotime($period_row['date2'])-strtotime($period_row['date1']);
$all_days = ceil($time / 86400)+1; //всего дней за период
$month = preg_replace("#.+-(.+)-.+#","$1",$period_row['date1']);
$shablon = array("#01#","#02#","#03#","#04#","#05#","#06#","#07#","#08#","#09#","#10#","#11#","#12#");
$replace = array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентрябрь","Октябрь","Ноябрь","Декабрь");
$month_rus = preg_replace($shablon,$replace,$month);
$year = preg_replace("#(.+)-.+-.+#","$1",$period_row['date1']);
$all_days_in_first_month = date("t",strtotime($period_row['date1']));
$days_in_first_month = preg_replace("#.+-.+-(.+)#","$1",$period_row['date1']);
$first_month_days = ($all_days_in_first_month+1) - $days_in_first_month; //находим сколько осталось дней до конца месяца
echo "<div align='center'>".$month_rus." - ".$year."<table class='period_period'>";
for($i=0;$i<$first_month_days;$i++) //строим график первого месяца
{
if($i==0) {$begin_day = preg_replace("#.+-.+-(.+)#","$1",$period_row['date1']);} $day = $begin_day+$i; if(strlen($day)==1) {$day = "0".$day;};
if($i==0 or $i==7 or $i==14 or $i==21 or $i==28) echo "<tr>";
echo "<td>".$day."</td>";
}
echo "</table></div>";
unset($shablon); unset($replace);
$all_days = $all_days - $first_month_days;
if($all_days>0)
{
for($i=0;$i++<$all_days;)
{
$year = date("Y",mktime(0,0,0,$month+$i));
$next_month = date("m",mktime(0,0,0,$month+$i));
$shablon = array("#01#","#02#","#03#","#04#","#05#","#06#","#07#","#08#","#09#","#10#","#11#","#12#");
$replace = array("Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентрябрь","Октябрь","Ноябрь","Декабрь");
$next_month_rus = preg_replace($shablon,$replace,$next_month);
$days_in_next_month = date("t",mktime(0,0,0,$month+$i));
$all_days = $all_days - $days_in_next_month;
if($all_days < 0)
{
$all_days = $days_in_next_month - preg_replace("#-#","",$all_days);
echo "<div align='center'>".$next_month_rus." - ".$year."<table class='period_period'>";
for($i2=0;$i2<$all_days;$i2++)
{
$day = $i2+1; if(strlen($day)==1) {$day = "0".$day;}
if($i2==0 or $i2==7 or $i2==14 or $i2==21 or $i2==28) echo "<tr>";
echo "<td>".$day."</td>";
}
echo "</table></div>";
break;
}
else {
echo "<div align='center'>".$next_month_rus." - ".$year."<table class='period_period'>";
for($i2=0;$i2<$days_in_next_month;$i2++)
{
$day = $i2+1; if(strlen($day)==1) {$day = "0".$day;}
if($i2==0 or $i2==7 or $i2==14 or $i2==21 or $i2==28) echo "<tr>";
echo "<td>".$day."</td>";
}
echo "</table></div>";
}
}
}
?>
|
Но если поменять с $period_row['date2'] = "2014-09-26"; на $period_row['date2'] = "2015-09-26"; то не сработает правильно... | |
|
|
|
|
|
|
|
для: ladan
(18.07.2012 в 12:06)
| | Ответьте сначала на такой вопрос - зачем вот это (и подобное этому) preg_replace("#.+-(.+)-.+#","$1",$period_row['date1']) в коде? | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 12:21)
| | это вытаскивается из бд, там поле типа date. Через регулярку получаю год, месяц, день.. | |
|
|
|
|
|
|
|
для: ladan
(18.07.2012 в 12:24)
| | Вон оно как! Ну тогда объясните, что делает вот эта функция - strtotime($period_row['date2'])? | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 12:28)
| | преобразует дату в секунды! Может есть какие-то нелепые моменты в скрипте, мне важнее чтоб работало корректно.. | |
|
|
|
|
|
|
|
для: ladan
(18.07.2012 в 12:31)
| | Значит знаете, что данная функция возвращает, как и должны знать о функции date(). Потому и задаю еще раз вопрос - зачем в данном коде совсем никчемное применение рег. выражений?
>Может есть какие-то нелепые моменты в скрипте, мне важнее чтоб работало корректно.
Зная вроде бы о функциях, и при этом писать эти нелепости... ну это я не знаю даже как назвать. Писать код спустя рукава, пофигу как, лишь бы что-то там делало, это как строить замок из песка, пофигу что развалится, лишь бы минуту простояло.
Я бегло просмотрел ваш код, но могу сказать, что делать это надо не так. Могу сказать как лучше можно, и без "нелепостей", но позже, сейчас некогда. | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 12:44)
| | я в функции особо не углублялся, поверхностно знаю, что они делают..
Я просто сейчас не ищу способов как можно грамотнее писать. Но и не понимать, почему скрипт так работает тоже не хочу, пусть и неграмотно, но зато знаю как это работает... Нужно быстрее дописать движок, чтоб скорее запустить, а там со временем улучшать код... как-то так.
Буду признателен, если покажете как правильно решить задачу! :) | |
|
|
|
|
|
|
|
для: ladan
(18.07.2012 в 13:29)
| | Поверхностное знание, это грех, и наказуемый впоследствии.
Углубляться то не очень и сильно надо, чтобы знать о работе и возможностях функций. Зная что они делают, а использоваться бог весь что вместо этих функций, это уже халтура. Я не люблю халтуру (все ее не любят), и если вам надо лишь бы работал этот код, пусть и с халтурой, то править я не буду, просто нет никакого желания.
Пусть его правит кто либо другой ) | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 14:32)
| | нет, мне интересно знать как правильно это делается. У меня опыта 0, я сайт первый раз с 0 делаю.. Некому меня учить писать грамотный код, приходится самому что-то изобретать... Вот и получается... работает и ладно... а делается ли это вообще так я не знаю... но все равно придет время, когда движок переписать придется.. | |
|
|
|
|
|
|
|
для: ladan
(18.07.2012 в 14:47)
| | Если интересно знать, то позже напишу.
А вы открывайте описание функции date(), и внимательно, а не поверхностно, ознакомтесь с ее возможностями. Ее описание ясно указывает на то, что все эти preg_.... в вашем коде как собаке пятая лапа, они не нужны тут и не оправданы. | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 14:54)
| | спасибо! на телефоне деньги закончились, обязательно почитаю попозже | |
|
|
|
|
|
|
|
для: ladan
(18.07.2012 в 12:06)
| | Самая большая нелепость в вашем календаре, которая не дает ему права быть показанным, это даже не в коде, а в том, что каждый месяц вашего календаря начинается с понедельника (хотя вы и не указываете в нем дни недели, но это подразумевается по выводу строк таблиц), словно вашему календарю принятое летоисчисление побоку, или ваш календарь, это что-то свое, нестандартное.
И даты в календаре не пишут как 01, 02, 03..., а пишут 1, 2, 3...
Функция strtotime() возвращает UNIX timestamp (временную метку, в секундах) из строкового представления даты. А функция date() может возвращать различные параметры даты из timestamp. Из этого следует, что для получения календаря, вам надо знать только временную метку, получая из нее все необходимые данные, и бедлама подобного preg_... для этого совсем не нужно.
Кроме этого, стили нужно использовать, а не атрибуты. Таблицы в одного родителя, и центровку производить в нем. В примере указан минимум их, без всякой центровки, и выделения воскресений. Сами добавите, надеюсь поймете как. Нет, значит это с вопросами в другой раздел.
Вариант 1 - проход одним циклом.
<style>
table {
font: 9pt arial;
color:#000;
empty-cells: hide;
}
caption {
font-weight: bold;
}
table tr:first-child td {
background: #eee;
}
td {
text-align: right;
border: 1px solid #000;
}
</style>
<?
//установка локали для даты
//кодовая страница 1251 указана потому,
//что в Widows нельзя установить локаль в UTF,
//и если ваш код в UTF, значит установите ее,
//на сервере это можно,
//а для проверки под Windows,
//при utf-8, далее в коде применяется iconv()
//если же ваш код, это windows-1251
//то необходимость в iconv() отпадает
setlocale(LC_TIME, 'Russian_Russia.1251');
$dt_start = strtotime("2012-07-18");
$dt_end = strtotime("2014-09-26");
$month = '';
$calendar = '';
while($dt_start <= $dt_end) {
//получаем название месяца на русском
$m = strftime('%B', $dt_start);
//определяем день недели начала месяца
$week = date("w",$dt_start);
//закрываем строку таблицы,
//если следующая неделя
if($week==1 && $m==$month) $calendar .= '</tr><tr>';
//приведем дни недели к русскому порядку
$week = !$week ? 6 : $week-1;
if($m!=$month) { //если начало месяца, выводим шапку
$month = $m;
$calendar .= '<table><caption>'.iconv('cp1251','utf-8',$m).' - '.date("Y",$dt_start).'</caption>
<tr><td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td><td>Пт</td>
<td>Сб</td><td>Вс</td></tr><tr>';
//выводим пустые ячейки перед первым днем месяца
$calendar .= str_repeat('<td></td>', $week);
}
//выводим день
$calendar .= '<td>'.date("j",$dt_start).'</td>';
//если далее следующий месяц,
//закрываем таблицу
if($month!=strftime('%B', $dt_start+86400)) $calendar .= '</tr></table>';
//увеличиваем временную метку на сутки
$dt_start += 86400;
}
echo $calendar.'</tr></table>';
?>
|
Месяц может заканчиваться не обязательно так, что число ячеек таблицы будет корректным, но при указанном empty-cells в стилях для таблицы, таблица будет отображаться корректно. Если же потребуется вывод и пустых ячеек, то нужно будет дополнять таблицу такими ячейками.
Код варианта 2 я приводить не буду, просто скажу как еще можно сделать. Получать число дней в месяце и выводить каждую таблицу своим циклом. Но, закрывать строки таблиц каждой недели, это не if($i2==0 or $i2==7 or $i2==14 or $i2==21 or $i2==28), а проверкой делением по модулю 7 (число дней в неделе).
Но также надо определять день недели первого дня месяца (и стартового), сдвигая его в таблице на необходимую позицию. Не буду говорить как это сделать, не используя функцию date(), попробуйте сами, да и вообще весть вариант такой написать (если уж интересно). Если не будете кидаться в крайности подобные preg_, будете думать, то и такой вариант будет намного компактнее вашего кода. | |
|
|
|
|
|
|
|
для: confirm
(18.07.2012 в 22:16)
| | Спасибо большое за пример! Вот этот момент вообще не понятен...
$week = !$week ? 6 : $week-1; //первый раз вижу такую арифметику
| Попробую сделать как вы сказали- Получать число дней в месяце и выводить каждую таблицу своим циклом.
проверкой делением по модулю 7 (число дней в неделе).
|
Это точно!
Буду писать второй вариант, посмотрю что получится.. | |
|
|
|
|
|
|
|
для: ladan
(23.07.2012 в 10:08)
| | >первый раз вижу такую арифметику
В USA календаре начало недели, это воскресенье (нулевой день), последний день недели, это суббота (шестой день), что и возвращает функция date().
В нашем календаре, начало недели, это понедельник (нулевой день), а функция date() возвращает его как первый день, то есть вторником по нашему.
Вот для этого и нужна эта арифметика. Если бы внимательно прочли о параметрах функции date(), то вопроса подобного бы не возникло.
>Получать число дней в месяце и выводить каждую таблицу своим циклом.
Сделайте, но только ради познания, для практического применения, это не лучший вариант.
Вы обратите внимание на следующее:
1) на дни недели, о чем я говорил уже;
2) на выходные;
3) ваш календарь весь в столбик, а вы выведите его, например, в три колонки, по три месяца в ряду, станет видно, что календарь смотрится неопрятно:
___ если стартовый месяц не с первого числа, то его стартовая неделя всегда первая, хотя это не совсем так может быть;
___ таблицы месяцев имеют разную высоту, что портит дизайн;
4) прописывать год в каждом месяце тоже не ахти (если выводить месяцы не в одну колонку), можно ведь и шапку годовую выводить, а ниже его месяцы. | |
|
|
|
|
|
|
|
для: confirm
(23.07.2012 в 11:02)
| | Спасибо еще раз! Очень помогли! | |
|
|
|
|
|
|
|
для: ladan
(23.07.2012 в 11:35)
| | Да на здоровье ) Немного есть времени, потому заключительный пример можно написать. Пример использует CSS3, и не ставит целью кроссбраузерное отображение идеи, и проверялось только в Chrome.
Вывод календаря производится по три месяца в строке, при этом количество месяцев в строке указывается не программно, а определяется исключительно стилями родительского блока - его шириной.
Как я говорил ранее, в первом примере, с точки зрения валидности html-кода, код таблиц месяцев некорректный, последняя его строка не обязательно содержит полное количество ячеек. В CSS3 появился (наконец-то, свершилось) селектор :last-child, позволяющий описать правила стилей последнего дочернего элемента в наборе. В полной мере воспользоваться CSS3 может смогут дети ваших детей, но в примере будем использовать именно возможности CSS3.
Селектором :last-child будем подсвечивать красным выходные дни - воскресения:
td:last-child {
border: 1px solid #FFE3E3;
background: #FFECEC;
color: #f00;
}
| Правило указывает - применить данный стиль к последней ячейке в строке, а это будет каждая седьмая, то есть воскресения. Но, если месяц не оканчивается воскресением, и последняя строка таблицы месяца не заполнена всеми ячейками, согласно этому правилу красным днем календаря станет и последний день месяца, не важно какой он в реальности будет - понедельник, вторник...
Чтобы избежать такого поведения, необходимо полностью закрывать последнюю строку таблицы, пустыми ячейками. Кроме этого, нужно добавлять строки пустых ячеек в конец таблиц, для того, чтобы выравнять их по высоте, иначе при блочном выводе месяцев календарь будет выглядеть неопрятно.
Я специально не добавляю в код комментариев - предлагаю самостоятельно проанализировать строки кода, что они делают, тем более, что часть из них такая же как и в первом примере.
<style>
div {
width: 350pt;
}
table {
font: 9pt arial;
color:#000;
border: 1px solid #C9C9C9;
border-top: 0;
margin-bottom: 5pt;
float: left;
margin-right: 4pt;
}
table tr:first-child td {
background: #A0A0A0;
border: 1px solid #909090;
color: #fff;
}
td {
text-align: right;
background: #F5F5F5;
border: 1px solid #E5E5E5;
}
td:last-child {
border: 1px solid #FFE3E3;
background: #FFECEC;
color: #f00;
}
table tr:first-child td:last-child {
background: #D05757;
border: 1px solid #A75151;
}
td:empty {
height: 19px;
border: 1px dotted #EDEDED;
background: none;
}
td.skip {
color: #B7B7B7;
background: #F9F9F9;
border-color: #F5F5F5;
}
caption {
border: 1px solid #C9C9C9;
border-bottom: 0;
background-color: #C9C9C9;
background: #EAEAEA;
font-weight: bold;
}
span {
display: inline-block;
width: 345pt;
font: bold 13pt arial;
line-height: 13pt;
border-bottom: 2px solid #000;
margin-bottom: 5pt;
margin-top: 5pt;
}
</style>
<div>
<?php
setlocale(LC_TIME, 'Russian_Russia.1251');
$dt_start = strtotime("2012-07-18");
$dt_end = strtotime("2014-09-26");
$days = date("j",$dt_start)>1 ? $dt_start-86400*(date("j",$dt_start)-1) : $dt_start;
$first_month = strftime('%B', $days);
$year = 0;
$month = '';
$first_week = 0;
$empty_row = '<tr>'.str_repeat('<td></td>',7).'</tr>';
$calendar = '';
while($days <= $dt_end) {
$y = date("Y", $days);
$m = strftime('%B', $days);
$week = date("w", $days);
if($week==1 && $m==$month) $calendar .= '</tr><tr>';
$week = !$week ? 6 : $week-1;
$day = date("j", $days);
if($m != $month) {
$month = $m;
$first_week = $week;
if($year != $y) {
$calendar .= '<span>'.$y.'</span>';
$year = $y;
}
$calendar .= '<table><caption>'.iconv('cp1251','utf-8',$m).'</caption>
<tr><td>Пн</td><td>Вт</td><td>Ср</td><td>Чт</td>
<td>Пт</td><td>Сб</td><td>Вс</td></tr><tr>'.
str_repeat('<td></td>', $first_week);
}
$calendar .= '<td'.($month==$first_month && $day<date("j",$dt_start)
? ' class=skip' : null).'>'.$day.'</td>';
if($month!=strftime('%B', $days+86400))
$calendar .= str_repeat('<td></td>', 6 - $week).'</tr>'.
str_repeat($empty_row, (42-($day+$first_week+6-$week))/7).'</table>';
$days += 86400;
}
$week = date("w",$dt_end);
$week= !$week ? 6 : $week-1;
$calendar .= str_repeat('<td></td>', 6 - $week).'</tr>'.
str_repeat($empty_row,(42-(date("j",$dt_end)+$first_week+6-$week))/7).'</table>';
echo $calendar;
?>
</div>
|
| |
|
|
|
|
|
|
|
для: confirm
(25.07.2012 в 00:14)
| | классный календарь получился! Ваш скрипт самый мощный, который стоит на моем сайте :) Да... интересно, какой опыт надо иметь, чтоб такой код писать, наверняка, Вы подобный код с закрытыми глазами пишите и все работает с первого раза! | |
|
|
|
|
|
|
|
для: ladan
(26.07.2012 в 10:19)
| | >который стоит на моем сайте
Надеюсь вы его не просто скопировали, а учли замечания о CSS3 и о кроссбраузерности.
>интересно, какой опыт надо иметь, чтоб такой код писать, наверняка, Вы подобный код с закрытыми глазами пишите и все работает с первого раза!
С первого раза даже брюки не одеть, обязательно потребуется вторая операция - застегнуть ширинку. )
Для такого кода как этот календарь большого опыта не надо, достаточно ясно понимать, что вы хотите сделать и знать возможности функций языка для работы с определенными данными (либо не лениться поискать такие функции в руководстве).
Вы ведь тоже прекрасно знаете, что время можно разбить на отрезки: год, квартал, месяц, декада, неделя, час, минуты, секунды, миллисекунды, микросекунды... А если мы знаем это, и знаем границы раздела на эти отрезки, сможем ли мы ответить на вопрос - достаточно ли будет единственного цикла, чтобы получить необходимые отрезки времени и вывести их? Сможем, так как знаем границы раздела отрезков, а значит нужно просто проверять наступление начала и конца этих отрезков в потоке данных. Это как на метре откладывать определенные отрезки - для того чтобы отложить, не обязательно разрезать метр, и на нем отложить отрезок, потом склеить метр опять, в следующей точке опять разрезать, опять отложить...
Если вы работаете с данными даты/времени, думаю не трудно понять, что инструментарий для работы надо искать в разделе руководства описывающего функции для работы с такими данными. В РНР их не так и много, много времени не нужно для ознакомления с ними, и выбора необходимых.
Если мы знаем две временных метки - начальную и конечную, и следуя сказанному выше, вполне сможем разбить этот поток времени на нужные нам отрезки. Но мы имеем время начала и конца как строки, что весьма неудобно для извлечения из них различных необходимых нам значений времени - это нужно разбивать на составляющие, проверять, дополнять, опять склеивать..., жуть. Естественно возникает вопрос - а если функция, которая бы превратила эти строковые значения времени в нечто удобное, из которого бы впоследствии можно было получать необходимое? Немного покопавшись среди инструментария руководства, находим такую - strtotime(). А чем же получить из этого нам необходимое? Опять углубившись, причем не на долго, в инструментарий, понимаем, что подходящая для этого функция, это date().
Подобным образом (после обязательно задания вопроса себе - if(exists function for...)) находим функцию strftime(), так как зная, что все это буржуйское, по русски not шпрехен, но вдруг..., чтобы не писать массив "январь", "февраль"... И хотя strftime не все шпрехен (не все форматы его аргумента будту работать в зависимости от библиотеки, платформы), но в том, что нам надо она шпрехает, этого и достаточно.
Все, вот и весь опыт, вернее не опыт, а любопытство. Все остальное, это уже детали, которые зависят от условий задачи решаемой. А сам костяк такого кода пишется конечно же сразу, слету. Конечно что-то можно упустить, где-то допустить..., не без этого, но это поправимо.
В большей степени все зависит от вашего мышления, и если логика вас не подводит, если вы можете сразу видеть задачу в общем, можете ее разбить на отдельные составляющие, то это то, что и определяет успех. А найти необходимое среди функций языка, так для этого достаточно отсутствие лени и доля азарта. В дальнейшем, при многократном применении функций, они становятся уже почти инстинктами вашими.
Вы можете не согласиться с последним параграфом, но тогда ответьте на вопрос:
<?
//почему в это строке кода операнды условия прописаны так:
$month==$first_month && $day<date("j",$dt_start) ? ' class=skip' : null
//ведь будет работать и так:
$day<date("j",$dt_start) && $month==$first_month ? ' class=skip' : null
//почему выбран именно первый вариант?
|
| |
|
|
|
|
|
|
|
для: confirm
(26.07.2012 в 12:04)
| | Согласен с вами, что ленится не нужно. Скорее всего это моя ошибка.. В написании скриптов в справочник заглядываю только тогда, когда вообще задача не решается, ищу функции, а так, чтоб уточнить как можно правильнее написать- ленюсь... это из серии "зачем мне что-то искать, когда можно через preg_replace все получить". Если бы вы взглянули как я пишу скрипты, вы бы выделили все через Ctrl+A и нажали кнопку Delete )
Вы можете не согласиться с последним параграфом, но тогда ответьте на вопрос:
Могу только предположить, что первый правильнее, т.к такая последовательность более верная- год - месяц - день - час и тп... Или почему так? | |
|
|
|
|
|
|
|
для: ladan
(26.07.2012 в 12:39)
| | Нужно изучать язык, его функции, чтобы писать на нем что-то, иначе не будет никакого проку ни от этого занятия, ни от результата. В руководстве как раз и нужно искать ответы на вопросы - чем можно решить эту задачу.
Разбор строки регулярными выражениями, это затратные операции, и вы должны знать это. Использование этих функций там, где без них можно обойтись, причем гораздо более эффективными инструментами, это очень и очень плохо. Веб-приложение, это приложение работающее на компьютере вам не принадлежащем, где зачастую существуют ограничения как на память, так и на время для процессов, поэтому писать код не важно каким способом, лишь бы что-то делало, это плохо.
Обе строки кода в вопросе правильные с точки зрения синтаксиса и выполняемой задачи, так что выбор определяется не этим. А вот последовательность времени, это ближе к ответу, хотя ответа вы и не дали.
Ваш календарь может начинаться не сначала месяца. Можно конечно эти дни пропустить, заполнив их пустыми ячейками таблицы (чтобы дизайн не портить), а можно вывести пропущенные дни, приглушив их стиль - цвет. Что я и сделал.
А чтобы вывести такие дни, естественно нужно проверять текущий день (день на момент итерации цикла), является ли он пропущенным днем или нет. Кроме этого, пропущенные дни может содержать только первый месяц (и отсутствующие, последние дни в последнем месяце, что я не стал делать), а значит нужно проверять еще и текущий месяц - равен ли он стартовому месяцу календаря или нет. Для этого название стартового месяца сохраняется в переменной, с которой сравнивается текущий месяц.
Последовательность времени, это относительно понятие, как и само понятие Время, которое более широкое, чем мы пользуемся, к тому же далеко не однозначное и не совсем изученное. Если говорить именно о течение времени, то все как раз наоборот - из мельчайшей его частицы складываются секунды, из них минуты и часы, затем дни, недели, месяцы, годы. Именно метку времени исчисляемую секундами от 1970-01-01 и возвращает функция strtitime().
Но нам для календаря нужны - год и его месяцы, а в месяце его количество дней. В году 12 месяцев и 365 дней (не високосные годы), это вы знаете. А вот и ответ на вопрос:
Если в условии сначала проверять месяц а затем текущий день, то при проходе в цикле времени длинною в год, придется выполнить 12 проверок, плюс N-проверок на дни месяца (но только стартового месяца). Если месяц стартовый, то будет проверяться еще и день. Если месяц не равен стартовому, то проверку дней интерпретатор производить уже не будет.
Если в условии сначала проверять день, а затем месяц, то интерпретатор будет выполнять 356 + 12 проверок в году. Другими словами, вы напрасно заставляли бы его выполнять бесполезную работу - не смотря на то, что месяц не стартовый, все равно производились бы проверки каждого дня текущего месяца.
Вот прописать в условии порядок проверки именно так, как я прописал, это и есть видение и понимание той задачи, которую вы решаете, плюс логика мышления. | |
|
|
|
|
|
|
|
для: confirm
(26.07.2012 в 13:23)
| | Спасибо, буду теперь это знать :) | |
|
|
|
|