線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4244
推到 Plurk!
推到 Facebook!

西曆農曆轉換程式

 
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-05 12:08:29 IP:61.218.xxx.xxx 未訂閱

西曆農曆轉換程式

================================================================ 資料來源: 睡魔工作室 http://www.taconet.com.tw/sroom/
  prototype:  int CalConv( struct ConvDate * );      struct ConvDate
  {
    int Source;       ==0 則輸入日期為西曆, !=0 則輸入為農曆
    int SolarYear;    輸出或輸入之西曆年份
    int SolarMonth;   西曆月
    int SolarDate;    西曆日
    int LunarYear;    輸出或輸入之農曆年份
    int LunarMonth;   農曆月
    int LunarDate;    農曆日
    int Weekday;      該日為星期幾 ( 0==星期日, 1==星期一, ... )
    int Kan;          該日天干     ( 0==甲, 1==乙, ..., 9==癸 )
    int Chih;         該日地支     ( 0==子, 1==丑, ..., 11==亥 )
  };
呼叫時須設定 Souce 的值, 若為 0 則為西曆轉農曆, 否則為農曆轉西曆. 然後視 輸入為西曆或農曆來設定西曆或農曆的年月日. 轉換後的年月日會填入結構中( 農 曆或西曆 ), 以及該日為星期幾, 天干地支. 若函式的返回值為 0 表示沒有錯誤, 1 為輸入之年份錯誤, 2 為輸入之月份錯誤, 3 為輸入之日期錯誤. 輸入之西曆年須在 1937 - 2031 間 輸入之農曆年須在 1936 - 2030 間 若須擴充, 則增加 LunarCal[] */
#define FIRSTYEAR 1936  /* The first year in LunarCal[] */    struct ConvDate
{
  int Source;
  int SolarYear;
  int SolarMonth;
  int SolarDate;
  int LunarYear;
  int LunarMonth;
  int LunarDate;
  int Weekday;
  int Kan;
  int Chih;
};    struct tagLunarCal
{
  int BaseDays;         /* 到西曆 1 月 1 日到農曆正月初一的累積日數 */
  int Intercalation;    /* 閏月月份. 0==此年沒有閏月 */
  int BaseWeekday;      /* 此年西曆 1 月 1 日為星期幾再減 1 */
  int BaseKanChih;      /* 此年西曆 1 月 1 日之干支序號減 1 */
  int MonthDays[13];    /* 此農曆年每月之大小, 0==小月(29日), 1==大月(30日) */
};    struct tagLunarCal LunarCal[] = {
{ 23,  3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 },  /* 1936 */
{ 41,  0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 },
{ 30,  7, 5, 28, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 },
{ 49,  0, 6, 33, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 38,  0, 0, 38, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },  /* 1940 */
{ 26,  6, 2, 44, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 45,  0, 3, 49, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 35,  0, 4, 54, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 24,  4, 5, 59, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 },  /* 1944 */
{ 43,  0, 0,  5, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 },
{ 32,  0, 1, 10, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 },
{ 21,  2, 2, 15, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 40,  0, 3, 20, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },  /* 1948 */
{ 28,  7, 5, 26, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 47,  0, 6, 31, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 36,  0, 0, 36, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 26,  5, 1, 41, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 },  /* 1952 */
{ 44,  0, 3, 47, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1 },
{ 33,  0, 4, 52, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 },
{ 23,  3, 5, 57, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 },
{ 42,  0, 6,  2, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 },  /* 1956 */
{ 30,  8, 1,  8, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 },
{ 48,  0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 },
{ 38,  0, 3, 18, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 27,  6, 4, 23, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 },  /* 1960 */
{ 45,  0, 6, 29, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 },
{ 35,  0, 0, 34, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 24,  4, 1, 39, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 },
{ 43,  0, 2, 44, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 },  /* 1964 */
{ 32,  0, 4, 50, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 },
{ 20,  3, 5, 55, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 },
{ 39,  0, 6,  0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0 },
{ 29,  7, 0,  5, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 },  /* 1968 */
{ 47,  0, 2, 11, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 36,  0, 3, 16, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 },
{ 26,  5, 4, 21, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1 },
{ 45,  0, 5, 26, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 },  /* 1972 */
{ 33,  0, 0, 32, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1 },
{ 22,  4, 1, 37, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 },
{ 41,  0, 2, 42, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1 },
{ 30,  8, 3, 47, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 },  /* 1976 */
{ 48,  0, 5, 53, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 },
{ 37,  0, 6, 58, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 27,  6, 0,  3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 },
{ 46,  0, 1,  8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0 },  /* 1980 */
{ 35,  0, 3, 14, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1 },
{ 24,  4, 4, 19, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1 },
{ 43,  0, 5, 24, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1 },
{ 32, 10, 6, 29, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1 },  /* 1984 */
{ 50,  0, 1, 35, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 39,  0, 2, 40, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1 },
{ 28,  6, 3, 45, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0 },
{ 47,  0, 4, 50, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },  /* 1988 */
{ 36,  0, 6, 56, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 },
{ 26,  5, 0,  1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1 },
{ 45,  0, 1,  6, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0 },
{ 34,  0, 2, 11, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0 },  /* 1992 */
{ 22,  3, 4, 17, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 40,  0, 5, 22, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 30,  8, 6, 27, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1 },
{ 49,  0, 0, 32, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1 },  /* 1996 */
{ 37,  0, 2, 38, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 27,  5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 46,  0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 },
{ 35,  0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 },  /* 2000 */
{ 23,  4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 42,  0, 1,  4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 31,  0, 2,  9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 21,  2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 },  /* 2004 */
{ 39,  0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 28,  7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 },
{ 48,  0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 },
{ 37,  0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 },  /* 2008 */
{ 25,  5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 44,  0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 33,  0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 22,  4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },  /* 2012 */
{ 40,  0, 1,  2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 30,  9, 2,  7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 },
{ 49,  0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1 },
{ 38,  0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 },  /* 2016 */
{ 27,  6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 },
{ 46,  0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0 },
{ 35,  0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 },
{ 24,  4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },  /* 2020 */
{ 42,  0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 31,  0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 21,  2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 },
{ 40,  0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },  /* 2024 */
{ 28,  6, 2,  5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 },
{ 47,  0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1 },
{ 36,  0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 },
{ 25,  5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 },  /* 2028 */
{ 43,  0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 },
{ 32,  0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0 },
{ 22,  3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 } };    #define LASTYEAR (FIRSTYEAR sizeof(LunarCal)/sizeof(struct tagLunarCal)-1)    /* 西曆年每月之日數 */
int SolarCal[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };    /* 西曆年每月之累積日數, 平年與閏年 */
int SolarDays[2][14] = {
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 396 },
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 397 } };    /* 求此西曆年是否為閏年, 返回 0 為平年, 1 為閏年 */
int GetLeap( int year )
{
  if ( year % 400 == 0 )
    return 1;
  else if ( year % 100 == 0 )
    return 0;
  else if ( year % 4 == 0 )
    return 1;
  else
    return 0;
}    /* 西曆農曆轉換 */
int CalConv( struct ConvDate *cd )
{
  int leap, d, sm, y, im, l1, l2, acc, i, lm, kc;
  if ( cd->Source == 0 )  /* Solar */
  {
    if ( cd->SolarYear <= FIRSTYEAR || cd->SolarYear > LASTYEAR )
      return 1;
    sm = cd->SolarMonth - 1;
    if ( sm < 0 || sm > 11 )
      return 2;
    leap = GetLeap( cd->SolarYear );
    if ( sm == 1 )
      d = leap   28;
    else
      d = SolarCal[sm];
    if ( cd->SolarDate < 1 || cd->SolarDate > d )
      return 3;
    y = cd->SolarYear - FIRSTYEAR;
    acc = SolarDays[leap][sm]   cd->SolarDate;
    cd->Weekday = ( acc   LunarCal[y].BaseWeekday ) % 7;
    kc = acc   LunarCal[y].BaseKanChih;
    cd->Kan = kc % 10;
    cd->Chih = kc % 12;
    if ( acc <= LunarCal[y].BaseDays )
    {
      y--;
      cd->LunarYear = cd->SolarYear - 1;
      leap = GetLeap( cd->LunarYear );
      sm  = 12;
      acc = SolarDays[leap][sm]   cd->SolarDate;
    }
    else
      cd->LunarYear = cd->SolarYear;
    l1 = LunarCal[y].BaseDays;
    for ( i=0; i<13; i   )
    {
      l2 = l1   LunarCal[y].MonthDays[i]   29;
      if ( acc <= l2 )
        break;
      l1 = l2;
    }
    cd->LunarMonth = i   1;
    cd->LunarDate = acc - l1;
    im = LunarCal[y].Intercalation;
    if ( im != 0 && cd->LunarMonth > im )
    {
      cd->LunarMonth--;
      if ( cd->LunarMonth == im )
        cd->LunarMonth = -im;
    }
    if ( cd->LunarMonth > 12 )
      cd->LunarMonth -= 12;
  }
  else  /* Lunar */
  {
    if ( cd->LunarYear < FIRSTYEAR || cd->LunarYear >= LASTYEAR )
      return 1;
    y = cd->LunarYear - FIRSTYEAR;
    im = LunarCal[y].Intercalation;
    lm = cd->LunarMonth;
    if ( lm < 0 )
    {
      if ( lm != -im )
        return 2;
    }
    else if ( lm < 1 || lm > 12 )
      return 2;
    if ( im != 0 )
    {
      if ( lm > im )
        lm  ;
      else if ( lm == -im )
        lm = im   1;
    }
    lm--;
    if ( cd->LunarDate > LunarCal[y].MonthDays[lm]   29 )
      return 3;
    acc = LunarCal[y].BaseDays;
    for ( i=0; iLunarDate;
    leap = GetLeap( cd->LunarYear );
    for ( i=13; i>=0; i-- )
      if ( acc > SolarDays[leap][i] )
        break;
    cd->SolarDate = acc - SolarDays[leap][i];
    if ( i <= 11 )
    {
      cd->SolarYear = cd->LunarYear;
      cd->SolarMonth = i   1;
    }
    else
    {
      cd->SolarYear = cd->LunarYear   1;
      cd->SolarMonth = i - 11;
    }
    leap = GetLeap( cd->SolarYear );
    y = cd->SolarYear - FIRSTYEAR;
    acc = SolarDays[leap][cd->SolarMonth-1]   cd->SolarDate;
    cd->Weekday = ( acc   LunarCal[y].BaseWeekday ) % 7;
    kc = acc   LunarCal[y].BaseKanChih;
    cd->Kan = kc % 10;
    cd->Chih = kc % 12;
  }
  return 0;
}
聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
8866
中階會員


發表:27
回覆:147
積分:69
註冊:2002-10-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-05 23:25:46 IP:61.230.xxx.xxx 未訂閱
引言:

西曆農曆轉換程式

================================================================ 資料來源: 睡魔工作室 http://www.taconet.com.tw/sroom/
  prototype:  int CalConv( struct ConvDate * );      struct ConvDate
  {
    int Source;       ==0 則輸入日期為西曆, !=0 則輸入為農曆
    int SolarYear;    輸出或輸入之西曆年份
    int SolarMonth;   西曆月
    int SolarDate;    西曆日
    int LunarYear;    輸出或輸入之農曆年份
    int LunarMonth;   農曆月
    int LunarDate;    農曆日
    int Weekday;      該日為星期幾 ( 0==星期日, 1==星期一, ... )
    int Kan;          該日天干     ( 0==甲, 1==乙, ..., 9==癸 )
    int Chih;         該日地支     ( 0==子, 1==丑, ..., 11==亥 )
  };
呼叫時須設定 Souce 的值, 若為 0 則為西曆轉農曆, 否則為農曆轉西曆. 然後視 輸入為西曆或農曆來設定西曆或農曆的年月日. 轉換後的年月日會填入結構中( 農 曆或西曆 ), 以及該日為星期幾, 天干地支. 若函式的返回值為 0 表示沒有錯誤, 1 為輸入之年份錯誤, 2 為輸入之月份錯誤, 3 為輸入之日期錯誤. 輸入之西曆年須在 1937 - 2031 間 輸入之農曆年須在 1936 - 2030 間 若須擴充, 則增加 LunarCal[] */
#define FIRSTYEAR 1936  /* The first year in LunarCal[] */    struct ConvDate
{
  int Source;
  int SolarYear;
  int SolarMonth;
  int SolarDate;
  int LunarYear;
  int LunarMonth;
  int LunarDate;
  int Weekday;
  int Kan;
  int Chih;
};    struct tagLunarCal
{
  int BaseDays;         /* 到西曆 1 月 1 日到農曆正月初一的累積日數 */
  int Intercalation;    /* 閏月月份. 0==此年沒有閏月 */
  int BaseWeekday;      /* 此年西曆 1 月 1 日為星期幾再減 1 */
  int BaseKanChih;      /* 此年西曆 1 月 1 日之干支序號減 1 */
  int MonthDays[13];    /* 此農曆年每月之大小, 0==小月(29日), 1==大月(30日) */
};    struct tagLunarCal LunarCal[] = {
{ 23,  3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 },  /* 1936 */
{ 41,  0, 4, 23, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 },
{ 30,  7, 5, 28, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 },
{ 49,  0, 6, 33, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 38,  0, 0, 38, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },  /* 1940 */
{ 26,  6, 2, 44, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 45,  0, 3, 49, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 35,  0, 4, 54, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 24,  4, 5, 59, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 },  /* 1944 */
{ 43,  0, 0,  5, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 },
{ 32,  0, 1, 10, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 },
{ 21,  2, 2, 15, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 40,  0, 3, 20, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },  /* 1948 */
{ 28,  7, 5, 26, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 47,  0, 6, 31, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 36,  0, 0, 36, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 26,  5, 1, 41, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 },  /* 1952 */
{ 44,  0, 3, 47, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1 },
{ 33,  0, 4, 52, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 },
{ 23,  3, 5, 57, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 },
{ 42,  0, 6,  2, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 },  /* 1956 */
{ 30,  8, 1,  8, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 },
{ 48,  0, 2, 13, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0 },
{ 38,  0, 3, 18, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 27,  6, 4, 23, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 },  /* 1960 */
{ 45,  0, 6, 29, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 },
{ 35,  0, 0, 34, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 24,  4, 1, 39, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 },
{ 43,  0, 2, 44, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 },  /* 1964 */
{ 32,  0, 4, 50, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 },
{ 20,  3, 5, 55, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 },
{ 39,  0, 6,  0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0 },
{ 29,  7, 0,  5, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 },  /* 1968 */
{ 47,  0, 2, 11, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 36,  0, 3, 16, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 },
{ 26,  5, 4, 21, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1 },
{ 45,  0, 5, 26, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 },  /* 1972 */
{ 33,  0, 0, 32, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1 },
{ 22,  4, 1, 37, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 },
{ 41,  0, 2, 42, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1 },
{ 30,  8, 3, 47, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 },  /* 1976 */
{ 48,  0, 5, 53, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1 },
{ 37,  0, 6, 58, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 27,  6, 0,  3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0 },
{ 46,  0, 1,  8, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0 },  /* 1980 */
{ 35,  0, 3, 14, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1 },
{ 24,  4, 4, 19, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1 },
{ 43,  0, 5, 24, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1 },
{ 32, 10, 6, 29, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1 },  /* 1984 */
{ 50,  0, 1, 35, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 39,  0, 2, 40, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1 },
{ 28,  6, 3, 45, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0 },
{ 47,  0, 4, 50, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },  /* 1988 */
{ 36,  0, 6, 56, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 },
{ 26,  5, 0,  1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1 },
{ 45,  0, 1,  6, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0 },
{ 34,  0, 2, 11, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0 },  /* 1992 */
{ 22,  3, 4, 17, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 40,  0, 5, 22, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 30,  8, 6, 27, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1 },
{ 49,  0, 0, 32, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1 },  /* 1996 */
{ 37,  0, 2, 38, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 27,  5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 },
{ 46,  0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 },
{ 35,  0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 },  /* 2000 */
{ 23,  4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 42,  0, 1,  4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 31,  0, 2,  9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 },
{ 21,  2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 },  /* 2004 */
{ 39,  0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 },
{ 28,  7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 },
{ 48,  0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 },
{ 37,  0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 },  /* 2008 */
{ 25,  5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 44,  0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 },
{ 33,  0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },
{ 22,  4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },  /* 2012 */
{ 40,  0, 1,  2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 30,  9, 2,  7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 },
{ 49,  0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1 },
{ 38,  0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 },  /* 2016 */
{ 27,  6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 },
{ 46,  0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0 },
{ 35,  0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 },
{ 24,  4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 },  /* 2020 */
{ 42,  0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 },
{ 31,  0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 },
{ 21,  2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 },
{ 40,  0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 },  /* 2024 */
{ 28,  6, 2,  5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 },
{ 47,  0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1 },
{ 36,  0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 },
{ 25,  5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 },  /* 2028 */
{ 43,  0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 },
{ 32,  0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0 },
{ 22,  3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 } };    #define LASTYEAR (FIRSTYEAR sizeof(LunarCal)/sizeof(struct tagLunarCal)-1)    /* 西曆年每月之日數 */
int SolarCal[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };    /* 西曆年每月之累積日數, 平年與閏年 */
int SolarDays[2][14] = {
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 396 },
{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366, 397 } };    /* 求此西曆年是否為閏年, 返回 0 為平年, 1 為閏年 */
int GetLeap( int year )
{
  if ( year % 400 == 0 )
    return 1;
  else if ( year % 100 == 0 )
    return 0;
  else if ( year % 4 == 0 )
    return 1;
  else
    return 0;
}    /* 西曆農曆轉換 */
int CalConv( struct ConvDate *cd )
{
  int leap, d, sm, y, im, l1, l2, acc, i, lm, kc;
  if ( cd->Source == 0 )  /* Solar */
  {
    if ( cd->SolarYear <= FIRSTYEAR || cd->SolarYear > LASTYEAR )
      return 1;
    sm = cd->SolarMonth - 1;
    if ( sm < 0 || sm > 11 )
      return 2;
    leap = GetLeap( cd->SolarYear );
    if ( sm == 1 )
      d = leap   28;
    else
      d = SolarCal[sm];
    if ( cd->SolarDate < 1 || cd->SolarDate > d )
      return 3;
    y = cd->SolarYear - FIRSTYEAR;
    acc = SolarDays[leap][sm]   cd->SolarDate;
    cd->Weekday = ( acc   LunarCal[y].BaseWeekday ) % 7;
    kc = acc   LunarCal[y].BaseKanChih;
    cd->Kan = kc % 10;
    cd->Chih = kc % 12;
    if ( acc <= LunarCal[y].BaseDays )
    {
      y--;
      cd->LunarYear = cd->SolarYear - 1;
      leap = GetLeap( cd->LunarYear );
      sm  = 12;
      acc = SolarDays[leap][sm]   cd->SolarDate;
    }
    else
      cd->LunarYear = cd->SolarYear;
    l1 = LunarCal[y].BaseDays;
    for ( i=0; i<13; i   )
    {
      l2 = l1   LunarCal[y].MonthDays[i]   29;
      if ( acc <= l2 )
        break;
      l1 = l2;
    }
    cd->LunarMonth = i   1;
    cd->LunarDate = acc - l1;
    im = LunarCal[y].Intercalation;
    if ( im != 0 && cd->LunarMonth > im )
    {
      cd->LunarMonth--;
      if ( cd->LunarMonth == im )
        cd->LunarMonth = -im;
    }
    if ( cd->LunarMonth > 12 )
      cd->LunarMonth -= 12;
  }
  else  /* Lunar */
  {
    if ( cd->LunarYear < FIRSTYEAR || cd->LunarYear >= LASTYEAR )
      return 1;
    y = cd->LunarYear - FIRSTYEAR;
    im = LunarCal[y].Intercalation;
    lm = cd->LunarMonth;
    if ( lm < 0 )
    {
      if ( lm != -im )
        return 2;
    }
    else if ( lm < 1 || lm > 12 )
      return 2;
    if ( im != 0 )
    {
      if ( lm > im )
        lm  ;
      else if ( lm == -im )
        lm = im   1;
    }
    lm--;
    if ( cd->LunarDate > LunarCal[y].MonthDays[lm]   29 )
      return 3;
    acc = LunarCal[y].BaseDays;
    for ( i=0; iLunarDate;
    leap = GetLeap( cd->LunarYear );
    for ( i=13; i>=0; i-- )
      if ( acc > SolarDays[leap][i] )
        break;
    cd->SolarDate = acc - SolarDays[leap][i];
    if ( i <= 11 )
    {
      cd->SolarYear = cd->LunarYear;
      cd->SolarMonth = i   1;
    }
    else
    {
      cd->SolarYear = cd->LunarYear   1;
      cd->SolarMonth = i - 11;
    }
    leap = GetLeap( cd->SolarYear );
    y = cd->SolarYear - FIRSTYEAR;
    acc = SolarDays[leap][cd->SolarMonth-1]   cd->SolarDate;
    cd->Weekday = ( acc   LunarCal[y].BaseWeekday ) % 7;
    kc = acc   LunarCal[y].BaseKanChih;
    cd->Kan = kc % 10;
    cd->Chih = kc % 12;
  }
  return 0;
}
聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
是否有人得知 struct tagLunarCal LunarCal[] = {{ 23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 }, /* 1936 */ 其中的各個數字的意義與推算方法 ???
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-16 13:26:31 IP:61.218.xxx.xxx 未訂閱
引言: 是否有人得知 struct tagLunarCal LunarCal[] = {{ 23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 }, /* 1936 */ 其中的各個數字的意義與推算方法 ???
請參考這一篇: 如何轉換陰陽曆 http://www.chinesefortunecalendar.com/clc/clcBig5.htm http://www.nmns.edu.tw/New/Education/ActivitySheet/pre-unit23/g-p4.htm 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
8866
中階會員


發表:27
回覆:147
積分:69
註冊:2002-10-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-16 19:24:42 IP:210.68.xxx.xxx 未訂閱
引言:
引言: 是否有人得知 struct tagLunarCal LunarCal[] = {{ 23, 3, 2, 17, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0 }, /* 1936 */ 其中的各個數字的意義與推算方法 ???
請參考這一篇: 如何轉換陰陽曆 http://www.chinesefortunecalendar.com/clc/clcBig5.htm http://www.nmns.edu.tw/New/Education/ActivitySheet/pre-unit23/g-p4.htm 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
axsoft 謝了 !!! 花了一些時間去 "理解" , 才發現其中另有 "奧妙" ! 只怪自己才疏學淺 , 太晚知曉 ...................
系統時間:2024-04-19 19:08:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!