AlexDeb

Вычисление дня недели по году

Nov 15th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.49 KB | None | 0 0
  1. <?php
  2. $arrTest = [
  3. //Тест кейсы
  4.     "2016-01-01" => "Должно быть: Пятница",
  5.     "1972-02-15" => "Должно быть: Вторник",
  6.     "1990-03-11" => "Должно быть: Воскресенье",
  7.     "2000-12-12" => "Должно быть: Втоорник",
  8.     "2070-08-09" => "Должно быть: Суббота",
  9.     "2080-07-02" => "Должно быть: Вторник",
  10.     "2004-02-29" => "Должно быть: Воскресенье",
  11.     "2025-01-01" => "Должно быть: Среда",
  12.     "1985-09-16" => "Должно быть: Понедельник",
  13.     "2090-07-02" => "Должно быть: Воскресенье",
  14.     "2099-07-01" => "Должно быть: Среда",
  15.     "2150-11-25" => "Должно быть: Среда",
  16.     "1821-01-01" => "Должно быть: Понедельник",
  17.     "2250-01-01" => "Должно быть: Вторник",
  18.     "1000-01-01" => "Должно быть: Среда",
  19.     "950-12-03" => "Должно быть: Четверг",
  20.     "500-01-03" => "Должно быть: Воскресенье",
  21.     "3000-08-18" => "Должно быть: Понедельник",
  22.     "450-12-15" => "Должно быть: Четверг",
  23.     "1655-12-12" => "Должно быть: Воскресенье",
  24.     "1300-01-01" => "Должно быть: Пятница",
  25.     "1970-02-11" => "Должно быть: Среда",
  26.     "1970-06-20" => "Должно быть: Субота",
  27. ];
  28. function ShowDayOfTheWeek($array)
  29. {
  30.  
  31.     foreach ($array as $date => $value) {//проходим по массиву и поочередно подставляем значения
  32.  
  33.  
  34.         $arrDate = explode("-", $date);//Разбиваем строку на, элементы массива
  35.  
  36.         $starting = 0;//начальная дата отсчета
  37.         $current = 0;//заданный год
  38.  
  39.         if ($arrDate[0] < 1970) {//в зависимости от года, в переменные подставляются разные значения
  40.             $starting = 1970;
  41.             $current = $arrDate[0];
  42.         } else {
  43.             $starting = $arrDate[0];
  44.             $current = 1970;
  45.         }
  46.  
  47.         $dayYear = ($starting - $current) * 365;//Считаем отдельно количество лет, прошедших с 1970
  48.  
  49.         $dayMonth = 0;//Инициализируем переменную
  50.  
  51.         switch ($arrDate[1]) {//Считаем количество дней, в месяце плюс указанное количество дней
  52.             case 1;
  53.                 $dayMonth = ($arrDate[2] - 1);
  54.                 break;
  55.             case 2;
  56.                 $dayMonth = 31 + ($arrDate[2] - 1);
  57.                 break;
  58.             case 3;
  59.                 $dayMonth = 59 + ($arrDate[2] - 1);
  60.                 break;
  61.             case 4;
  62.                 $dayMonth = 90 + ($arrDate[2] - 1);
  63.                 break;
  64.             case 5;
  65.                 $dayMonth = 120 + ($arrDate[2] - 1);
  66.                 break;
  67.             case 6;
  68.                 $dayMonth = 151 + ($arrDate[2] - 1);
  69.                 break;
  70.             case 7;
  71.                 $dayMonth = 181 + ($arrDate[2] - 1);
  72.                 break;
  73.             case 8;
  74.                 $dayMonth = 212 + ($arrDate[2] - 1);
  75.                 break;
  76.             case 9;
  77.                 $dayMonth = 243 + ($arrDate[2] - 1);
  78.                 break;
  79.             case 10;
  80.                 $dayMonth = 273 + ($arrDate[2] - 1);
  81.                 break;
  82.             case 11;
  83.                 $dayMonth = 304 + ($arrDate[2] - 1);
  84.                 break;
  85.             case 12;
  86.                 $dayMonth = 334 + ($arrDate[2] - 1);
  87.                 break;
  88.         }
  89.  
  90.  
  91.         $leapDay = 0;//инициализируем переменную, для подсчета высокосных дней
  92.         $year = array();
  93.         $lastleap = 0;
  94.         for ($k = $current; $k <= $starting; $k++) {//проходим в цикле от 1970 дня до указанной даты
  95.             if (($k % 4 == 0 && $k % 100 != 0) || ($k % 400 == 0)) {//если год соотвецтвует этим условиям, значит он высокосный
  96.                 $leapDay += 1;
  97.                 $lastleap = $k;//присваиваем переменной lastleap;  первый встречающийся высокосный год
  98.                 $year[] = $k;//присваиваем переменной year  последний встречающийся высокосный год
  99.             }
  100.         }
  101.  
  102.         if ($arrDate[0] < 1970) {//В зависимости от года, присваиваем значения
  103.             $leapYear = $year[0];
  104.         } else {
  105.             $leapYear = $lastleap;
  106.         }
  107.  
  108.  
  109.         if ($arrDate[0] == $leapYear) {// если заданный год  высокосный, то заходим в цикл
  110.             if ($dayMonth < 59) {//до 28 февраля, мы не добавляем лишний день в году
  111.                 $dayMonth = $dayMonth - 1;
  112.             } elseif ($arrDate[1] == 02 && $arrDate[2] == 29) {//если заданный день равен 29 февраля, то отнимаем один день
  113.                 $dayMonth = $dayMonth - 1;
  114.             }
  115.         }
  116.  
  117.  
  118.         if ($arrDate[0] == $leapYear) {// если заданный год  высокосный, то заходим в цикл
  119.  
  120.         }
  121.  
  122.  
  123.         if ($arrDate[0] < 1970) {
  124.             $sumDay = (($dayYear - $dayMonth) + $leapDay);//находим общую сумму дней от 1970 до указанной даты
  125.         } else {
  126.             $sumDay = (($dayYear + $dayMonth) + $leapDay);//находим общую сумму дней от указанной даты до 1970
  127.         }
  128.  
  129.         //Делим общее количество дней на 7, если оно делится без остатка, то это первый день недели в нашем списке,
  130.         // если остаток 1, то второй и так далее
  131.         if ($arrDate[0] < 1970) {
  132.             switch ($sumDay % 7) {
  133.                 case 0;
  134.                     echo $date . "__" . "Четверг -" . $value . "<br>";
  135.                     break;
  136.                 case 1;
  137.                     echo $date . "__" . "Среда -" . $value . "<br>";
  138.                     break;
  139.                 case 2;
  140.                     echo $date . "__" . "Вторник -" . $value . "<br>";
  141.                     break;
  142.                 case 3;
  143.                     echo $date . "__" . "Понедельник -" . $value . "<br>";
  144.                     break;
  145.                 case 4;
  146.                     echo $date . "__" . "Воскресенье -" . $value . "<br>";
  147.                     break;
  148.                 case 5;
  149.                     echo $date . "__" . "Субота -" . $value . "<br>";
  150.                     break;
  151.                 case 6;
  152.                     echo $date . "__" . "Пятница -" . $value . "<br>";
  153.                     break;
  154.             }
  155.  
  156.         } else {
  157.             //Делим общее количество дней на 7, если оно делится без остатка, то это первый день недели в нашем списке,
  158.             // если остаток 1, то второй и так далее
  159.             switch ($sumDay % 7) {
  160.                 case 0;
  161.                     echo $date . "__" . "Четверг -" . $value . "<br>";
  162.                     break;
  163.                 case 1;
  164.                     echo $date . "__" . "Пятница -" . $value . "<br>";
  165.                     break;
  166.                 case 2;
  167.                     echo $date . "__" . "Суббота -" . $value . "<br>";
  168.                     break;
  169.                 case 3;
  170.                     echo $date . "__" . "Воскресенье -" . $value . "<br>";
  171.                     break;
  172.                 case 4;
  173.                     echo $date . "__" . "Понедельник -" . $value . "<br>";
  174.                     break;
  175.                 case 5;
  176.                     echo $date . "__" . "Вторник -" . $value . "<br>";
  177.                     break;
  178.                 case 6;
  179.                     echo $date . "__" . "Среда -" . $value . "<br>";
  180.                     break;
  181.             }
  182.  
  183.         }
  184.  
  185.     }
  186.  
  187. }
  188.  
  189. ShowDayOfTheWeek($arrTest);//вызываем функцию, с тестовыми значениями
Advertisement
Add Comment
Please, Sign In to add comment