За последние 24 часа нас посетили 16629 программистов и 1677 роботов. Сейчас ищут 814 программистов ...

Сделай за меня определение учебной недели

Тема в разделе "Сделайте за меня", создана пользователем MinorityMeaning, 27 мар 2017.

  1. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    Преподаватель хочет чтобы я на php сделал вывод учебной недели в университете. Чтобы учебную неделю отображала (Верхняя/Нижняя), текущую по-порядку пару, и когда она окончится. Сказала сделаешь, поставлю зачёт. А я социолог, и в добавок пить люблю. В общем должником я сделался по веб разработке. Я это не осилю, и понимаю что, нагружен намеренно и поделом. Возмущаться не хочу, будет хуже. Вот, прошу помощи у вас

    И ещё деталь, вот что я нашёл в интернете по этому вопросу:
    Реализация, но только в Javascript:
    Код (Javascript):
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    2. <html>
    3. <head>
    4. <meta http-equiv="content-type" content="text/html; charset=Windows-1251">
    5. <title>Номер недели</title>
    6. </head><body>
    7.  
    8.  
    9. <script type="text/javascript">
    10.  
    11. function goodwordform(k,w,o1,o2,o5) { //Корректное склонение окончания слова
    12. if ( (k%100>10 && k%100<20) || k%10>4 || k%10==0) w+=o5;
    13. else if (k%10==1) w+=o1;
    14. else w+=o2;
    15. return w;
    16. }
    17.  
    18. function delta (year) { //Разница в днях текущей даты с новым годом для года year
    19. var date = new Date();
    20. var newYear = new Date(year, 0, 1);
    21. return (Math.floor((date.getTime() - newYear.getTime())/1000/60/60/24));
    22. }
    23.  
    24. function newYearDays () { //Выводим инфо о ближайших Новых годах
    25. var date = new Date();
    26. var Y = date.getFullYear();
    27. var delta1 = delta (Y);
    28. document.getElementById('info').innerHTML = '';
    29. if (delta1>0) document.getElementById('info').innerHTML += 'С Нового года '+goodwordform(delta1,'прош','ёл','ло','ло')+
    30.   ' '+delta1+' '+ goodwordform(delta1,'д','ень','ня','ней')+'<br>'+"\n";
    31. var delta2 = Math.abs(delta (Y+1));
    32. document.getElementById('info').innerHTML += 'До следующего Нового года '+goodwordform(delta2,'остал','ся','ось','ось')+
    33.   ' '+delta2+' '+ goodwordform(delta2,'д','ень','ня','ней')+'<br>'+"\n";
    34. }
    35.  
    36. var calStartDOW = 1; //С чего начинать неделю, в США день 0 (Вс), в мире день 1 (Пн)
    37.  
    38. function getWeekNum (day,month,year) { //Корректно определяем номер недели в году
    39. if (calStartDOW == 0) day++; //Чтоб работало и для САЩ :)
    40. month++; //в JS месяцы нумеруются с нуля!
    41. var a = Math.floor((14-month) / 12);
    42. var y = year + 4800 - a;
    43. var m = month + 12 * a - 3;
    44. var J = day + Math.floor((153 * m + 2) / 5) + 365 * y + Math.floor(y/4) -
    45.   Math.floor(y/100) + Math.floor(y/400) - 32045;
    46. d4 = (((J + 31741 - (J % 7)) % 146097) % 36524) % 1461;
    47. var L = Math.floor(d4 / 1460);
    48. var d1 = ((d4 - L) % 365) + L;
    49. var week = Math.floor(d1/7) + 1;
    50. if (week<10) week='0'+week; //Лидирующий ноль для недель 1-9
    51. return week;
    52. }
    53.  
    54. function numWeekSep (Y) { //Найти номер недели начала учебного года для года Y
    55. var date1 = new Date(Y,9-1,1);
    56. var wd1=date1.getDay();
    57. var nw1=getWeekNum(1,9-1,Y);
    58. if (wd1==0 || wd1==6) nw1++; //Если 1 сент. - Сб или Вс, начнём со след. Пн
    59. return nw1;
    60. }
    61.  
    62. function weekInfo () { //Выводим инфо о номере недели в году и семестре
    63. var date = new Date();
    64. var Y = date.getFullYear();
    65. var M = date.getMonth();
    66. var D=date.getDate();
    67. var NW=getWeekNum(D,M,Y);
    68. document.getElementById('info').innerHTML += 'Номер недели в году по стандарту ИСО: '+NW+'<br>'+"\n";
    69. //Ниже - "неуниверсальная" часть функции
    70. //Определяем неделю начала учебного года и номер недели в осеннем семестре
    71. if (M>8-1) { //осенний семестр - с 1 сентября, если оно не Сб или Вс, тогда со след. Пн
    72.   var nw1 = numWeekSep (Y);
    73.   var num=NW-nw1+1; //номер недели семестра
    74.   if (num>0 && num<16) { //Показываем не дольше 15 недель
    75.    document.getElementById('info').innerHTML += 'Номер недели в осеннем семестре: '+num;
    76.    if (NW%2==0) document.getElementById('info').innerHTML += ' (нижняя)'; //Верхняя/нижняя (нечетная/четная)
    77.    else document.getElementById('info').innerHTML += ' (верхняя)'; //определяется номером недели по ISO
    78.    document.getElementById('info').innerHTML += '<br>'+"\n"; //так что 1-я по порядку неделя может быть и "нижней"
    79.   }
    80. }
    81. else if (M<7-1) { //весенний семестр - NED недель спустя, но не раньше января и кончится не позже июля
    82.   var NED=20;
    83.   var nw1 = numWeekSep (Y-1);
    84.   //Ищем, когда прошло NED недель с начала учебного года (следующий Пн):
    85.   var nw2=getWeekNum(28,12-1,Y-1); //28 дек. гарантированно относится к прошлому году
    86.   var w28 = nw2-nw1+1;
    87.   var date2 = new Date(Y-1,12-1,28);
    88.   var wd28 = date2.getDay();
    89.   var t28 = date2.getTime();
    90.   while (!(wd28==1 && w28==NED)) { //ищем Пн, наступивший NED недель спустся после начала осеннего семестра
    91.    t28+=1000*60*60*24; //прибавить сутки
    92.    date2.setTime(t28);  
    93.    wd28 = date2.getDay();
    94.    if (wd28 == 1) w28++;
    95.   }
    96.   //Это будет начало весеннего семестра:
    97.   var date3 = new Date();
    98.   date3.setTime(t28);
    99.   var y2 = date3.getFullYear();
    100.   var m2 = date3.getMonth();
    101.   var d2 = date3.getDate();
    102.   var nw2=getWeekNum(d2,m2,y2);
    103.   var num=NW-nw2+1; //номер недели семестра
    104.   if (num>0 && num<21) { //Показываем не дольше 20 недель
    105.    document.getElementById('info').innerHTML += 'Номер недели в весеннем семестре: '+num;
    106.    if (NW%2==0) document.getElementById('info').innerHTML += ' (нижняя)';
    107.    else document.getElementById('info').innerHTML += ' (верхняя)';
    108.    document.getElementById('info').innerHTML += '<br>'+"\n";
    109.   }
    110. }
    111. }
    112.  
    113. function main () {
    114. newYearDays ();
    115. weekInfo ();
    116. window.setTimeout('main()',60000); //Обновлять раз в минуту
    117. }
    118.  
    119. document.writeln ('<p><small><span id="info"></span></small></p>');
    120. main();
    121. </script>
    122. <noscript>Извините, для работы приложения требуется включённый Javascript</noscript>
    123.  
    124. </body></html>
    Подсчёт недель в PHP:
    PHP:
    1. $wn=date('W',mktime(0,0,0,Месяц,День,Год));
    2. //Получить номер недели 01-52
    3. //"Неполные" недели в начале и конце года будут иметь номера 52 и 01 соотв.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты очень полезный и нужный человек.
     
  3. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    Нет предела счастью, от осознания собственной ценности
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    "Сделай за меня определение учебной недели"
    - согласен.
    Только "заплати за меня очередной взнос за ипотеку?"
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Какой результат должен получиться не понятно
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    http://besmarter.ru Точно знаю, что делают технические работы
     
  7. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    Вывод строчки (Верхняя неделя/Нижняя неделя)
     
  8. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    А если так: скинули мне кусочек, который умеет неделю выводить (Верхняя/Нижняя).
    Нужно запилить его, чтобы выводил ещё и текущую пару (В зависимости от времени: 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:
    1. <?php
    2.         $result="";
    3.         $indexOfWeek=0;
    4.         $dateDif=0;
    5.         $dateTimeZone= new DateTimeZone("Asia/Yakutsk");
    6.     $currentDate = new DateTime(null,$dateTimeZone);
    7.         $currentYear=$currentDate->format("Y");
    8.         $startDateOfLastAutumTerm = new DateTime(($currentYear-1)."-09-01",$dateTimeZone);
    9.         $startDateOfSpringTerm = new DateTime($currentYear."-02-01",$dateTimeZone);
    10.         $startDateOfAutumTerm = new DateTime($currentYear."-09-01",$dateTimeZone);
    11.      
    12.         $startDateOfWeekOfLastAutumTerm=$startDateOfLastAutumTerm->sub(new DateInterval("P".($startDateOfLastAutumTerm->format("N")-1)."D"));
    13.         $startDateOfWeekOfSpringTerm=$startDateOfSpringTerm->sub(new DateInterval("P".($startDateOfSpringTerm->format("N")-1)."D"));
    14.         $startDateOfWeekOfAutumTerm=$startDateOfAutumTerm->sub(new DateInterval("P".($startDateOfAutumTerm->format("N")-1)."D"));
    15.      
    16.         if($currentDate<$startDateOfWeekOfSpringTerm)
    17.         {
    18.             $dateDif=$currentDate->diff($startDateOfLastAutumTerm)->format("%a");  
    19.          
    20.         }else if($currentDate<$startDateOfWeekOfAutumTerm && $currentDate>=$startDateOfWeekOfSpringTerm)
    21.         {
    22.             $dateDif=$currentDate->diff($startDateOfWeekOfSpringTerm)->format("%a");  
    23.          
    24.         } else if($currentDate>=$startDateOfWeekOfAutumTerm)
    25.         {
    26.             $dateDif=$currentDate->diff($startDateOfWeekOfAutumTerm)->format("%a");
    27.         }
    28.         $indexOfWeek = (int)floor(($dateDif)/7);
    29.         $weekName = ($indexOfWeek%2==0)?"Верхняя неделя":"Нижняя неделя";
    30. ?>
    31. <div class="week_info">
    32.     <p class="week_info_text"><?php echo $weekName; ?></p>
    33. </div>
     
  9. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    Надежда теплится в душе
    Авось кто возьмётся за дело
    Готов подождать чуть по-дольше
    В добро я уверю смело
     
  10. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    1.Создать массив date-range (что примерно уже есть)


    PHP:
    1.  $dateRange = [
    2.             ['TimeStart' => '8:30','TimeEnd'=>'9.15','TimeBreak'=>5],
    3.             ['TimeStart' => '9:20','TimeEnd'=>'10.05','TimeBreak'=>10]
    4.         ];

    Всего 12 пар,если попали в пару номер 2,это это верхняя граница пары 1.
    12/2 = 6 пар всего

    2.Проверить в какой диапазон Вы попадете.

    3.Как только попали в какой-то диапазон времени ,вычислить разницу текущего времени у конца текущей пары.Тем самым Вы узнаете сколько осталось до конца пары времени

    Народ, отзовитесь!
    Или небось ждёте, пока сам всё запилю?
    Эх вы=)
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    боюсь, что это не так просто, как тебе кажется.

    а почему не хочешь заплатить?
     
  12. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    Денег нет
    А так само собой уже давно бы...
    Я попробую сейчас алгоритм сделать
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @MinorityMeaning можешь без кода, просто текстом объяснить что нужно, например вот будет всего одна страница, у нас есть расписание пар в таком формате, если сейчас такое время, то покажем это, если другое то другое, как бы описать все возможные варианты, но простым языком.
     
    MinorityMeaning нравится это.
  14. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    Конечно. На словах легко:

    Расписание пар:
    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 мин.

    Вот, примерно такое отображение и нужно, конечно, это всё можно видоизменить для удобства реализации
     
  15. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    @denis01, а как можно сравнивать время? Например чтобы пользоваться этим в конструкторе if

    Такой подход ведь будет наверняка неверным?
    PHP:
    1. date_default_timezone_set('Asia/Yakutsk');
    2.   $nachalo = '0:02';
    3.   $konec = '0:15';
    4.  
    5.   echo (date(" G:i "));
    6. if(date(" G:i ") < $nachalo & date(" G:i ") < $konec) {
    7. echo 'Идёт пара'; }  
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    переведи дату в число в секундах =) и будет легко сравнивать
     
  17. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    С помощью idate() ?

    Вот пробная конструкция, не могу разобраться:
    PHP:
    1. <?php
    2. date_default_timezone_set('Asia/Yakutsk');
    3. $nachalo = strtotime("1:12");
    4. $konec = strtotime("2:11");
    5. $tektime = date(' G:i ');
    6.   echo $tektime;
    7.  
    8. echo (date(' G:i ',$nachalo));
    9. echo (date(' G:i ', $konec));
    10. $itog = $konec - $nachalo;
    11. echo date('G:i' ,$itog);
    После выполнения выводит: 2:34 1:12 2:11 9:59

    Не могу понять, как правильно подойти ко времени. Чтобы сравнивать и выполнять математические операции.
     
  18. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    MinorityMeaning нравится это.
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    https://secure.php.net/manual/ru/datetime.createfromformat.php получившийся результат можно сравнивать между собой
     
    MinorityMeaning нравится это.
  20. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    Функция idate(), как я понял, вытаскивает только определённый кусок из времени
    PHP:
    1. <?php
    2. $konec = strtotime("2:11");
    3. echo idate('G',$konec);
    Результат: 2

    Мне что, придётся работать отдельно с часами и отдельно с минутами?
     
  21. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @MinorityMeaning ну ты бы всётаки перечитал мануал
    в частности G для меня загадка
    а 2 это видимо та оценка которая тебе светит))))))))))))
    --- Добавлено ---
    какие же эти социологи всётаки безпомощные))
    Код (Text):
    1. <?php
    2. $konec = strtotime("2:11");
    3. echo idate('U',$konec);
     
  22. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    PHP:
    1. <?php
    2. $nachalo = date_create_from_format('G:i', '8:30');
    3. $konec = date_create_from_format('G:i', '10:05');
    4. echo date_format($nachalo, 'G:i');
    5. echo date_format($konec, 'G:i');
    Имеешь ввиду что с этой функцией я могу делать такое:
    PHP:
    1. if(date('G:i') > date_format($nachalo, 'G:i') &
    2.    date('G:i') < date_format($konec, 'G:i'); ) {
    3.     echo 'Идёт первая пара' }
     
  23. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @MinorityMeaning ага в этом и смысл ещё бы добавить цикл пробежки по парам и дням недели
     
  24. MinorityMeaning

    MinorityMeaning Новичок

    С нами с:
    27 мар 2017
    Сообщения:
    40
    Симпатии:
    2
    Да нет, не будь таким категоричным
    G - это всего лишь 24 часовой формат

    Я посмотрел мануал, там U -Время в секундах, от начала эпохи UNIX
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    время в секундах оно в секундах от какого-то момента. От момента сотворения мира, например. Допустим у тебя есть событие через миллион секунд после сотворение мира. И второе событие через миллион и пять секунд от сотворения мира. Если вычесть одно из другого, если не обращать внимание на возможное отрицательное время, то получается пять секунд. Пять секунд перевести в ДАТУ - это пять секунд от сотворения мира. Это раз.

    Что ты хотел получить, вычитая дату из даты? Зачем потом засунул опять в дату то, что получил? Ты что хотел получить после?