2010-10-19 2 views
3

Я отлаживал этот устаревший код и хотел бы проверить его.Определите, является ли неделя нечетной или даже

Целью этого является позволить кому-либо выбрать частоту доставки для доставки продукта. Если кто-то хочет свой продукт Every Other Week, система должна определить, должны ли они получить заказ на следующей неделе или через две недели. Мы называем это неделей или неделей.

Имейте в виду, я не пишу это, я просто пытаюсь разобраться в ней и хотел бы получить некоторую помощь, оценивая ее точность:

if (date("l") == "Monday") { 
      $start = 0; 
     } else if (date("l") == "Tuesday" || date("l") == "Wednesday" || date("l") == "Thursday" || date("l") == "Friday" || date("l") == "Saturday"|| date("l") == "Sunday") { 
     $start = -1; 
    } 

    // if changing to every other week set to next week's a/b-ness 
    $a_week_tid = 34; 
    $b_week_tid = 35; 

    $every_other_week_frequency_id = 32; 

    if ($delivery_frequency == $every_other_week_frequency_id) { 
     $julian = (int) (strtotime('Monday +' . $start . ' week')/86400); 
     $julian_week = ($julian-4)/7; 
     if ($julian_week % 2) { 
      $today_a_or_b = $b_week_tid; 
      $next_week_a_or_b = $a_week_tid; 
      $a_or_b_week_string = '(A Week)'; 
     } else { 
      $today_a_or_b = $a_week_tid; 
      $next_week_a_or_b = $b_week_tid; 
      $a_or_b_week_string = '(B Week)'; 
     } 
    } else { 
     $next_week_a_or_b = NULL; 
     $a_or_b_week_string = NULL; 
    } 

Этот код не комментировали или документально. Часть, которая меня смущает:

  1. Почему 4 вычитается из Юлиана, а затем делится на 7?
  2. Если сегодня понедельник, $ julian_week - 2129, а 2129% 2 оценивает значение ИСТИНА. Это верно?
  3. Это даже то, как это должно быть сделано? Не могу ли я переписать это с использованием даты ('w') намного проще?
+0

Я не совсем понимаю, код, приведенный выше, так что могут быть некоторые будний связанных тонкостях, но это * возможно * можно переписать гораздо проще - по линии '(количество недель с момента заказа был помещено% 2 == 0? «неделя»: «B неделя») ' –

+2

Возможно, написан кем-то, кто не знает дату (« W »); – Incognito

ответ

7

Да, использование даты было бы намного проще, плюс учитывало бы високосные годы, летнее время, все, что лишний материал, с которым вы не хотите иметь дело.

if (date('W')%2==1) 

Это SOOOO намного проще в обслуживании, чем указано выше.

+0

Я тоже думал об этом, но не был уверен, что что-то произошло с расчетом даты php, о котором я не знал. – Kevin

+0

Пожалуйста, прочтите ниже ответ Брет Уиссель, если вы планируете использовать дату ('W'). И прочитайте [это] (http://en.wikipedia.org/wiki/ISO_week_date). Вам нужна дата ** ** ** для расчета нечетных/четных недель! Это просто невозможно сделать с датой («W»). – smhg

1
  1. Стандарт ИСО для первой недели в году заключается в том, что наступает неделя, когда падает первый четверг года. Это является причиной того, что 4 вычитаются из юлианской даты. Затем номер недели определяется делением на 7.

  2. Опять же, стандарт ИСО подразумевает, что номер недели не может превышать 53. Я не понимаю, как может возникнуть ваша цифра 2129. Однако оператор div не будет оценивать TRUE для этой цифры. Проверка оператора div на номере недели - это способ определить, находитесь ли вы на неделе a или b. Если до четверга, вполне вероятно, что число будет на 1 меньше, чем вы ожидаете.

  3. Кодировка выглядит довольно хорошо для меня, хотя я не прошел через все это. Это выглядит правильно.

+0

Это то, о чем я думал, но не считает ли дата ('w') ни одной из этих соображений? – Kevin

+0

Извините - я не знаю о дате ('w'). –

+0

дата ('W'). W - номер недели в году. – Kevin

0

Простой способ.

<?php 
    $weekNumber = date("W"); 
    echo 'Week number:',$weekNumber; 

    if($weekNumber&1) { 
    echo '<strong>Week A.</strong>'; 
    } else { 
    echo '<strong>Week B.</strong>'; 
    } 
?> 
3

Я не верю, что вы можете использовать дату («W») в этом случае. Согласно исчислению ИСО, иногда случаются годы с 53 неделями. В те годы за 53-й неделей следует неделя 01, как нечетные числа, так и расчет A/B, основанный на четном/недешевом номере недели ISO, приведет к двум последовательным неделям A или B.

Исходный расчет определяет количество дней с эпохи UNIX текущего понедельника или последнего понедельника, если сегодня не понедельник. -4 заставляет метки недели A/B меняться по четвергам. Четность/нечетность недели определяется с фиксированной даты (эпоха Unix), поэтому не будет разрыва в колебании A/B-ness с использованием исходного кода.

1

Использование W по последовательным пятницам, по модулю 2. Оба выхода линии 1. Так что это так будет время от времени.

echo date('W',strtotime('2016-01-01'))%2; 
echo date('W',strtotime('2016-01-08'))%2; 
Смежные вопросы