2010-10-19 132 views
3

我已經調試過這個遺留代碼,並且希望對它進行完整性檢查。確定一個星期是奇數還是偶數

它的目的是讓某人選擇發貨頻率來運送產品。如果有人每隔一週需要他們的產品,系統需要確定他們是否應該在下週或者從現在起兩週內下訂單。我們稱之爲一週或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')輕鬆地重寫這個嗎?
+0

我並不完全理解上面的代碼,所以可能會有一些平日相關的複雜性,但這種*力量*有可能改寫容易得多 - 沿'(週數的線,因爲訂的是放置%2 == 0?「A week」:「B week」)' – 2010-10-19 15:28:33

+2

可能由不知道日期的人寫成(「W」); – Incognito 2010-10-19 15:29:24

回答

7

是的,使用日期完全會更容易,再加上它考慮了閏年,夏令時,所有額外的東西,你不想處理。

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

這就是SOOOO比以上更容易維護。

+0

我也這麼認爲,但不知道是否有什麼關於PHP日期計算我不知道。 – Kevin 2010-10-19 16:37:17

+0

如果您計劃使用日期('W'),請閱讀下面的Bret Whissel的回答。並閱讀[this](http://en.wikipedia.org/wiki/ISO_week_date)。您需要**參考日期**才能計算奇數/偶數週!它不能用日期('W')來完成。 – smhg 2014-02-01 18:06:05

1
  1. 一年中第一週的ISO標準是它是一年中第一個星期四下降的一週。這是從Julian日期減去4的原因。然後通過除以7找到週數。

  2. 再一次,ISO標準意味着週數不能大於53.我不明白你2129的數字會如何產生。然而,div運算符不會評估這個數字的TRUE。在週數上檢查div運算符是確定您是在a周還是b周的方式。如果是在星期四之前,這個數字很可能會比你預期的少1。

  3. 編碼對我來說看起來相當不錯,儘管我還沒有完成所有的工作。它確實看起來正確。

+0

這是我認爲的那種 - 但是,date('w')沒有考慮到這一點嗎? – Kevin 2010-10-19 16:36:54

+0

對不起 - 我不知道日期('w')。 – 2010-10-19 16:52:22

+0

日期('W')。 W是一年的週數。 – Kevin 2010-10-19 17:53:30

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」)。根據ISO計算,有時候會有53周的時間。在那些年份中,第53周之後是第01周,都是奇數,而基於偶數/奇數ISO週數的A/B計算將導致連續兩週的A或B周。

原始計算確定本星期一的UNIX紀元或今天不是星期一的最近星期一的天數。 -4導致星期四的A/B星期標籤更改。偶數/奇怪的一週是由一個固定的日期(Unix Epoch)確定的,所以使用原始代碼將不會在A/B性的振盪中出現不連續性。

1

在連續的星期五使用W,mod爲2.兩行輸出1.這樣做有時會失敗。

echo date('W',strtotime('2016-01-01'))%2; 
echo date('W',strtotime('2016-01-08'))%2; 
相關問題