曆法計算由幾月幾號決定星期幾

開頭                                                                                                   


當電腦或者電子設備只要輸入日期與時間即會自動產生星期幾,基本上這是透過基本公式來產生,因此您並不需要自己設定星期。承襲上一篇衛星時間取得方法,可是衛星時間除了需進行UTC區域時間補償,同時星期也必須自行計算才能得到。

以下使用公式邏輯區分為a、b、m、d 四項                             

日曆上的西元1600年3月1號以後的每一天都表示為西元(100a+b)年m月d日
(1) d就是日曆上的"日"數
(2) m有特殊規定
      3月~12月 m流水號為 1~10;  1月=11; 2月=12
(3) a、b定義
      1 or 2月則為 100a+b=西元年數 -1
      3 ~12月則為 100a+b=西元年數

公式:                                                                                               

d+[2.6m-0.2] - 2a+b+[a/4]+[b/4]
[x]為高斯符號, ex: [3]=3;  [2.4]=2
回傳值: 0-6:星期日, 星期一.... 星期六 以此類推,當值為負數ex:-3, 正確為7-3=4 為星期四

程式撰寫                                                                                        

  • 編譯器:CCS PCWHD
  • 單晶片:Microchip PIC18F45K22

unsigned int8 RTC_Weekend_Transfer(unsigned int8 year_l, unsigned int8 month, unsigned int8 m_day, unsigned int8 year_h=20) 
  unsigned int8 m=0, a=0, b=0;
  a = year_h;
  b = year_l;
  if (month>=1 && month<=2) 
  {
    m = month+10;
    if (b==0) {a--; b=99;}
    else b--;
  }else m = month - 2;
  int w = m_day + (int)(2.6*m-0.2) - 2*a+b + (int)(a/4) + (int)(b/4);
  
  div_t idiv;
  idiv = div(w, 7);    
  w = (idiv.rem+7)%7;  //當餘數為負值時透過此程序可以轉正
  return w;  
}

沒有留言:

張貼留言

留言板