代码之家  ›  专栏  ›  技术社区  ›  Kevin

确定一周是奇数还是偶数

  •  3
  • Kevin  · 技术社区  · 15 年前

    我已经调试了这个遗留代码,希望对它进行一次正常检查。

    其目的是允许某人选择产品的发货频率。如果有人每隔一周就要他们的产品,系统需要确定他们是应该在下周,还是两周后得到订单。我们称之为一周,或B周。

    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. 如果今天是星期一,$julian_week是2129,2129%2评估为真。是这样吗?
    5 回复  |  直到 15 年前
        1
  •  8
  •   Bob Baddeley    15 年前

    是的,使用日期会更容易,再加上考虑闰年,夏令时,所有你不想处理的额外事情。

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

    这比上面说的要容易得多。

        2
  •  3
  •   Bret Whissel    11 年前

    我不相信你能在这种情况下使用日期(“W”)。根据ISO的计算,有时会有53周的年份。在这些年中,第53周之后是第01周,都是奇数,基于偶数/奇数ISO周数的A/B计算将导致连续两个A或B周。

    最初的计算确定从UNIX纪元开始的当前星期一的天数,如果今天不是星期一,则确定最近星期一的天数。这个 -4 导致A/B周标签在星期四更改。一周的偶数/奇数是由一个固定的日期(Unix纪元)决定的,因此使用原始代码a/B-ness的振荡不会有间断性。

        3
  •  1
  •   Chris Walton    15 年前
    1. 一年中第一周的ISO标准是,这一周是一年中的第一个星期四。这就是从儒略日期中减去4的原因。然后用7除以周数。

    2. 同样,ISO标准意味着周数不能大于53。我不明白你2129的数字怎么会出现。但是,div运算符对该图的计算结果不是TRUE。检查div运算符上的周数是确定您是否在a周还是b周的方法。如果是在星期四之前,则很可能该数字比您预期的少1。

    3. 代码对我来说相当不错,尽管我还没有全部完成。看起来确实是对的。

        4
  •  1
  •   Kyle Waters    9 年前

    在连续的星期五使用W,修改为2。两条线输出1。这样做有时会失败。

    echo date('W',strtotime('2016-01-01'))%2;
    echo date('W',strtotime('2016-01-08'))%2;
    
        5
  •  0
  •   Pedro    12 年前

    <?php
      $weekNumber = date("W");
       echo 'Week number:',$weekNumber;
    
        if($weekNumber&1) { 
         echo '<strong>Week A.</strong>';
       } else {
        echo '<strong>Week B.</strong>';
       }
     ?>
    
        6
  •  0
  •   Deepak Sharma    6 年前
        $day = '2019-11-10';
        $date = new DateTime($day);
        $dayOfMonth = $date->format("j"); // month days 1 - 30 
    
        $weekNumber = ceil($dayOfMonth / 7); // get the week number
    
        if ($weekNumber % 2 == 0) { //if week number is even
            echo "Even Week";
        } else {
            echo "Odd Week";
        }
    
        **// output   Even Week**
    
    推荐文章