Преподаватель хочет чтобы я на php сделал вывод учебной недели в университете. Чтобы учебную неделю отображала (Верхняя/Нижняя), текущую по-порядку пару, и когда она окончится. Сказала сделаешь, поставлю зачёт. А я социолог, и в добавок пить люблю. В общем должником я сделался по веб разработке. Я это не осилю, и понимаю что, нагружен намеренно и поделом. Возмущаться не хочу, будет хуже. Вот, прошу помощи у вас И ещё деталь, вот что я нашёл в интернете по этому вопросу: Реализация, но только в Javascript: Код (Javascript): <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=Windows-1251"> <title>Номер недели</title> </head><body> <script type="text/javascript"> function goodwordform(k,w,o1,o2,o5) { //Корректное склонение окончания слова if ( (k%100>10 && k%100<20) || k%10>4 || k%10==0) w+=o5; else if (k%10==1) w+=o1; else w+=o2; return w; } function delta (year) { //Разница в днях текущей даты с новым годом для года year var date = new Date(); var newYear = new Date(year, 0, 1); return (Math.floor((date.getTime() - newYear.getTime())/1000/60/60/24)); } function newYearDays () { //Выводим инфо о ближайших Новых годах var date = new Date(); var Y = date.getFullYear(); var delta1 = delta (Y); document.getElementById('info').innerHTML = ''; if (delta1>0) document.getElementById('info').innerHTML += 'С Нового года '+goodwordform(delta1,'прош','ёл','ло','ло')+ ' '+delta1+' '+ goodwordform(delta1,'д','ень','ня','ней')+'<br>'+"\n"; var delta2 = Math.abs(delta (Y+1)); document.getElementById('info').innerHTML += 'До следующего Нового года '+goodwordform(delta2,'остал','ся','ось','ось')+ ' '+delta2+' '+ goodwordform(delta2,'д','ень','ня','ней')+'<br>'+"\n"; } var calStartDOW = 1; //С чего начинать неделю, в США день 0 (Вс), в мире день 1 (Пн) function getWeekNum (day,month,year) { //Корректно определяем номер недели в году if (calStartDOW == 0) day++; //Чтоб работало и для САЩ :) month++; //в JS месяцы нумеруются с нуля! var a = Math.floor((14-month) / 12); var y = year + 4800 - a; var m = month + 12 * a - 3; var J = day + Math.floor((153 * m + 2) / 5) + 365 * y + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400) - 32045; d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461; var L = Math.floor(d4 / 1460); var d1 = ((d4 - L) % 365) + L; var week = Math.floor(d1/7) + 1; if (week<10) week='0'+week; //Лидирующий ноль для недель 1-9 return week; } function numWeekSep (Y) { //Найти номер недели начала учебного года для года Y var date1 = new Date(Y,9-1,1); var wd1=date1.getDay(); var nw1=getWeekNum(1,9-1,Y); if (wd1==0 || wd1==6) nw1++; //Если 1 сент. - Сб или Вс, начнём со след. Пн return nw1; } function weekInfo () { //Выводим инфо о номере недели в году и семестре var date = new Date(); var Y = date.getFullYear(); var M = date.getMonth(); var D=date.getDate(); var NW=getWeekNum(D,M,Y); document.getElementById('info').innerHTML += 'Номер недели в году по стандарту ИСО: '+NW+'<br>'+"\n"; //Ниже - "неуниверсальная" часть функции //Определяем неделю начала учебного года и номер недели в осеннем семестре if (M>8-1) { //осенний семестр - с 1 сентября, если оно не Сб или Вс, тогда со след. Пн var nw1 = numWeekSep (Y); var num=NW-nw1+1; //номер недели семестра if (num>0 && num<16) { //Показываем не дольше 15 недель document.getElementById('info').innerHTML += 'Номер недели в осеннем семестре: '+num; if (NW%2==0) document.getElementById('info').innerHTML += ' (нижняя)'; //Верхняя/нижняя (нечетная/четная) else document.getElementById('info').innerHTML += ' (верхняя)'; //определяется номером недели по ISO document.getElementById('info').innerHTML += '<br>'+"\n"; //так что 1-я по порядку неделя может быть и "нижней" } } else if (M<7-1) { //весенний семестр - NED недель спустя, но не раньше января и кончится не позже июля var NED=20; var nw1 = numWeekSep (Y-1); //Ищем, когда прошло NED недель с начала учебного года (следующий Пн): var nw2=getWeekNum(28,12-1,Y-1); //28 дек. гарантированно относится к прошлому году var w28 = nw2-nw1+1; var date2 = new Date(Y-1,12-1,28); var wd28 = date2.getDay(); var t28 = date2.getTime(); while (!(wd28==1 && w28==NED)) { //ищем Пн, наступивший NED недель спустся после начала осеннего семестра t28+=1000*60*60*24; //прибавить сутки date2.setTime(t28); wd28 = date2.getDay(); if (wd28 == 1) w28++; } //Это будет начало весеннего семестра: var date3 = new Date(); date3.setTime(t28); var y2 = date3.getFullYear(); var m2 = date3.getMonth(); var d2 = date3.getDate(); var nw2=getWeekNum(d2,m2,y2); var num=NW-nw2+1; //номер недели семестра if (num>0 && num<21) { //Показываем не дольше 20 недель document.getElementById('info').innerHTML += 'Номер недели в весеннем семестре: '+num; if (NW%2==0) document.getElementById('info').innerHTML += ' (нижняя)'; else document.getElementById('info').innerHTML += ' (верхняя)'; document.getElementById('info').innerHTML += '<br>'+"\n"; } } } function main () { newYearDays (); weekInfo (); window.setTimeout('main()',60000); //Обновлять раз в минуту } document.writeln ('<p><small><span id="info"></span></small></p>'); main(); </script> <noscript>Извините, для работы приложения требуется включённый Javascript</noscript> </body></html> Подсчёт недель в PHP: PHP: $wn=date('W',mktime(0,0,0,Месяц,День,Год)); //Получить номер недели 01-52 //"Неполные" недели в начале и конце года будут иметь номера 52 и 01 соотв.
"Сделай за меня определение учебной недели" - согласен. Только "заплати за меня очередной взнос за ипотеку?"
А если так: скинули мне кусочек, который умеет неделю выводить (Верхняя/Нижняя). Нужно запилить его, чтобы выводил ещё и текущую пару (В зависимости от времени: 1/2/3/4/5/6 пара) и сколько осталось до перерыва/до занятия. Пары идут по режиму: 1пара (8:30-9:15[пятиминутка]9:20-10:05(пер10мин) 2пара (10:15-11:00[пятиминутка]11:05-11:50(перер10мин) 3пара (12:00-12:45[пятиминутка]12:50-13:35(перер30мин) 4пара (14:05-14:50[пятиминутка]14:55-15:40(перер10мин) 5пара (15:50-16:35[пятиминутка]16:40-17:25(перер10мин) 6пара (17:35-18:20[пятиминутка]18:25-19:10(Занятия окончены) Воскресение выходной (но если честно, с этим можно, наверное, не заморачиваться) Вот, собственно говоря, скрипт (умеет только определять учебную неделю) PHP: <?php $result=""; $indexOfWeek=0; $dateDif=0; $dateTimeZone= new DateTimeZone("Asia/Yakutsk"); $currentDate = new DateTime(null,$dateTimeZone); $currentYear=$currentDate->format("Y"); $startDateOfLastAutumTerm = new DateTime(($currentYear-1)."-09-01",$dateTimeZone); $startDateOfSpringTerm = new DateTime($currentYear."-02-01",$dateTimeZone); $startDateOfAutumTerm = new DateTime($currentYear."-09-01",$dateTimeZone); $startDateOfWeekOfLastAutumTerm=$startDateOfLastAutumTerm->sub(new DateInterval("P".($startDateOfLastAutumTerm->format("N")-1)."D")); $startDateOfWeekOfSpringTerm=$startDateOfSpringTerm->sub(new DateInterval("P".($startDateOfSpringTerm->format("N")-1)."D")); $startDateOfWeekOfAutumTerm=$startDateOfAutumTerm->sub(new DateInterval("P".($startDateOfAutumTerm->format("N")-1)."D")); if($currentDate<$startDateOfWeekOfSpringTerm) { $dateDif=$currentDate->diff($startDateOfLastAutumTerm)->format("%a"); }else if($currentDate<$startDateOfWeekOfAutumTerm && $currentDate>=$startDateOfWeekOfSpringTerm) { $dateDif=$currentDate->diff($startDateOfWeekOfSpringTerm)->format("%a"); } else if($currentDate>=$startDateOfWeekOfAutumTerm) { $dateDif=$currentDate->diff($startDateOfWeekOfAutumTerm)->format("%a"); } $indexOfWeek = (int)floor(($dateDif)/7); $weekName = ($indexOfWeek%2==0)?"Верхняя неделя":"Нижняя неделя"; ?> <div class="week_info"> <p class="week_info_text"><?php echo $weekName; ?></p> </div>
Надежда теплится в душе Авось кто возьмётся за дело Готов подождать чуть по-дольше В добро я уверю смело
1.Создать массив date-range (что примерно уже есть) PHP: $dateRange = [ ['TimeStart' => '8:30','TimeEnd'=>'9.15','TimeBreak'=>5], ['TimeStart' => '9:20','TimeEnd'=>'10.05','TimeBreak'=>10] ]; Всего 12 пар,если попали в пару номер 2,это это верхняя граница пары 1. 12/2 = 6 пар всего 2.Проверить в какой диапазон Вы попадете. 3.Как только попали в какой-то диапазон времени ,вычислить разницу текущего времени у конца текущей пары.Тем самым Вы узнаете сколько осталось до конца пары времени Народ, отзовитесь! Или небось ждёте, пока сам всё запилю? Эх вы=)
@MinorityMeaning можешь без кода, просто текстом объяснить что нужно, например вот будет всего одна страница, у нас есть расписание пар в таком формате, если сейчас такое время, то покажем это, если другое то другое, как бы описать все возможные варианты, но простым языком.
Конечно. На словах легко: Расписание пар: 1пара (8:30-9:15[пятиминутка]9:20-10:05(пер10мин) 2пара (10:15-11:00[пятиминутка]11:05-11:50(перер10мин) 3пара (12:00-12:45[пятиминутка]12:50-13:35(перер30мин) 4пара (14:05-14:50[пятиминутка]14:55-15:40(перер10мин) 5пара (15:50-16:35[пятиминутка]16:40-17:25(перер10мин) 6пара (17:35-18:20[пятиминутка]18:25-19:10(Занятия окончены) Пользователь заходит на сайт, например, в 10:30, значит у него отобразиться примерное такое: Идёт: 2 пара. Конец пары: через 80 мин. Пользователь заходит на сайт, например, в 11:00: Идёт: 2 пара (перерыв). Конец пары: через 50 мин. Пользователь заходит на сайт, например, в 11:55: Идёт: перерыв. Начало пары: 3 пара, через 5 мин. Вот, примерно такое отображение и нужно, конечно, это всё можно видоизменить для удобства реализации
@denis01, а как можно сравнивать время? Например чтобы пользоваться этим в конструкторе if Такой подход ведь будет наверняка неверным? PHP: date_default_timezone_set('Asia/Yakutsk'); $nachalo = '0:02'; $konec = '0:15'; echo (date(" G:i ")); if(date(" G:i ") < $nachalo & date(" G:i ") < $konec) { echo 'Идёт пара'; }
С помощью idate() ? Вот пробная конструкция, не могу разобраться: PHP: <?php date_default_timezone_set('Asia/Yakutsk'); $nachalo = strtotime("1:12"); $konec = strtotime("2:11"); $tektime = date(' G:i '); echo $tektime; echo (date(' G:i ',$nachalo)); echo (date(' G:i ', $konec)); $itog = $konec - $nachalo; echo date('G:i' ,$itog); После выполнения выводит: 2:34 1:12 2:11 9:59 Не могу понять, как правильно подойти ко времени. Чтобы сравнивать и выполнять математические операции.
@MinorityMeaning idate(H:m,$konec) я то думал социлоги умеют читать комментарии https://php.ru/manual/function.idate.html
https://secure.php.net/manual/ru/datetime.createfromformat.php получившийся результат можно сравнивать между собой
Функция idate(), как я понял, вытаскивает только определённый кусок из времени PHP: <?php $konec = strtotime("2:11"); echo idate('G',$konec); Результат: 2 Мне что, придётся работать отдельно с часами и отдельно с минутами?
@MinorityMeaning ну ты бы всётаки перечитал мануал в частности G для меня загадка а 2 это видимо та оценка которая тебе светит)))))))))))) --- Добавлено --- какие же эти социологи всётаки безпомощные)) Код (Text): <?php $konec = strtotime("2:11"); echo idate('U',$konec);
PHP: <?php $nachalo = date_create_from_format('G:i', '8:30'); $konec = date_create_from_format('G:i', '10:05'); echo date_format($nachalo, 'G:i'); echo date_format($konec, 'G:i'); Имеешь ввиду что с этой функцией я могу делать такое: PHP: if(date('G:i') > date_format($nachalo, 'G:i') & date('G:i') < date_format($konec, 'G:i'); ) { echo 'Идёт первая пара' }
Да нет, не будь таким категоричным G - это всего лишь 24 часовой формат Я посмотрел мануал, там U -Время в секундах, от начала эпохи UNIX
время в секундах оно в секундах от какого-то момента. От момента сотворения мира, например. Допустим у тебя есть событие через миллион секунд после сотворение мира. И второе событие через миллион и пять секунд от сотворения мира. Если вычесть одно из другого, если не обращать внимание на возможное отрицательное время, то получается пять секунд. Пять секунд перевести в ДАТУ - это пять секунд от сотворения мира. Это раз. Что ты хотел получить, вычитая дату из даты? Зачем потом засунул опять в дату то, что получил? Ты что хотел получить после?