确定一周是奇数还是偶数

时间:2010-10-19 15:21:42

标签: php datetime

我已经调试了这个遗留代码,并希望对其进行健全性检查。

它的目的是允许某人选择运送产品的交货频率。如果有人想要他们的产品每隔一周,系统需要确定他们是否应该在下周或两周后获得订单。我们称之为一周或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. 为什么从朱利安减去4,然后除以7?
  2. 如果今天是星期一,$ julian_week是2129,而2129%2评估为TRUE。这是对的吗?
  3. 这是否应该如何完成?我不能用日期('w')更轻松地重写这个吗?

6 个答案:

答案 0 :(得分:7)

是的,使用日期会更容易,而且考虑到闰年,夏令时,所有额外的东西,你不想要处理。

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

这比以上更容易维护。

答案 1 :(得分:3)

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

原始计算确定当前星期一的UNIX时期或最近星期一(如果今天不是星期一)的天数。 -4导致A / B周标签在星期四更改。一周的偶数/奇数是从固定日期(Unix Epoch)确定的,因此使用原始代码在A / B-ness的振荡中不会出现不连续性。

答案 2 :(得分:1)

  1. 一年中第一周的ISO标准是,这是一年中第一个星期四下降的那一周。这就是从朱利安日期中减去4的原因。然后通过除以7找到周数。

  2. ISO标准再次暗示周数不能超过53.我不明白你的2129数字是如何产生的。但是,div运算符不会为此数字评估TRUE。在周数上检查div运算符是确定您是在a周还是b周的方式。如果是在星期四之前,这个数字很可能比你预期的少1。

  3. 编码看起来对我来说相当不错,尽管我还没有完成所有这些工作。看起来确实如此。

答案 3 :(得分:1)

在连续星期五使用W,mod由2.两行输出1.这样做有时会失败。

echo date('W',strtotime('2016-01-01'))%2;
echo date('W',strtotime('2016-01-08'))%2;

答案 4 :(得分:0)

只是一个简单的方法。

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

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

答案 5 :(得分:0)

    $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**