查看單個文章
舊 2006-09-21, 07:57 AM   #42 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

西元年轉農曆年的函數我已經作出來了,但目前只能轉出月份及日期
如2002/12/9已可轉換成十一月初六,目前年份的部分因為概念不是很好一直作不出來
是否有人可提供相關知識或自訂函數



因為陽曆週期是三百六十五天五時四十六秒,陰曆的週期是二十九天十二時四十四分三秒,所以想要使年為氣候變化的週期,月是月亮圓缺的週期,很不容易。但是,在我國秦朝末年,我們祖先就發明了『十九年加七個閏月』的方法。
因為農曆年平均十二個月,大月三十日,小月二十九日,全年共三百五十四日或三百五十五日,與太陽年〈三六五‧二四二一九日〉比較,每年相差平均十日又二十一小時,所以,夏曆年每三年中間,有一年多一個閏月,五年加多兩個閏月,有閏月這一年,共三百八十五日。

二十四節氣〈取至台灣民俗之旅〉


十二地支:

我國傳統將一日以十二個時辰來分,列表如下:

時辰 時間
子時 深夜十一時至子夜一時
丑時 子夜一時至三時
寅時 子夜三時至五時
卯時 清晨五時至七時
辰時 上午七時至九時
巳時 上午九時至十一時
午時 上午十一時至下午一時
未時 下午一時至三時
申時 下午三時至五時
酉時 下午五時至七時
戌時 晚上七時至九時
亥時 晚上九時至十一時

十天干:

是指甲、乙、丙、丁、戊、己、庚、辛、壬、癸,其中奇數位為陽干、偶數位為陰乾。

一個天干和一個地支相配,共有六十種組合,俗稱六十甲子,。

六十甲子可用來記錄年、月、日、時。如己卯年,六十年循環一次。民間習俗如擇日、合婚、喪葬、命名,均用這種名稱。


另外可否說明一下西元年轉農曆的函數呢? 謝謝!
以下網址有詳細說明
http://content.edu.tw/primary/fellow...aday/tra11.htm
香港天文台公曆與農曆日期對照表 1901至2010年 (PDF)
http://www.weather.gov.hk/gts/time/conversionc.htm


下面引用由Joseph在 2002/12/02 10:17am 發表的內容:
另有一個高人的html 日曆.
但本人功力太淺,看不明白..





台灣版(繁體)
台灣宗教節日版(繁體)
Netscape 相容版本(繁體)
中國版網站(簡體)
香港版(繁體)
美國中文版(繁體)

http://sean.wox.org/ap/calendar/
這是顯示在網頁的農民曆
不知可不可以應用到EXCEL
輸入西曆就可以顯示農民曆


FIRSTYEAR = 1998;
LASTYEAR = 2031;

today = new Date();
SolarYear = today.getFullYear();
SolarMonth = today.getMonth() + 1;
SolarDate = today.getDate();
Weekday = today.getDay();

LunarCal = [
new tagLunarCal( 27, 5, 3, 43, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ),
new tagLunarCal( 46, 0, 4, 48, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1 ), /* 88 */
new tagLunarCal( 35, 0, 5, 53, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1 ), /* 89 */
new tagLunarCal( 23, 4, 0, 59, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),
new tagLunarCal( 42, 0, 1, 4, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),
new tagLunarCal( 31, 0, 2, 9, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0 ),
new tagLunarCal( 21, 2, 3, 14, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1 ), /* 93 */
new tagLunarCal( 39, 0, 5, 20, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1 ),
new tagLunarCal( 28, 7, 6, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1 ),
new tagLunarCal( 48, 0, 0, 30, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1 ),
new tagLunarCal( 37, 0, 1, 35, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1 ), /* 97 */
new tagLunarCal( 25, 5, 3, 41, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 ),
new tagLunarCal( 44, 0, 4, 46, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1 ),
new tagLunarCal( 33, 0, 5, 51, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ),
new tagLunarCal( 22, 4, 6, 56, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ), /* 101 */
new tagLunarCal( 40, 0, 1, 2, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ),
new tagLunarCal( 30, 9, 2, 7, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 ),
new tagLunarCal( 49, 0, 3, 12, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1 ),
new tagLunarCal( 38, 0, 4, 17, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0 ), /* 105 */
new tagLunarCal( 27, 6, 6, 23, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1 ),
new tagLunarCal( 46, 0, 0, 28, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0 ),
new tagLunarCal( 35, 0, 1, 33, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ),
new tagLunarCal( 24, 4, 2, 38, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1 ), /* 109 */
new tagLunarCal( 42, 0, 4, 44, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 ),
new tagLunarCal( 31, 0, 5, 49, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 ),
new tagLunarCal( 21, 2, 6, 54, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1 ),
new tagLunarCal( 40, 0, 0, 59, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1 ), /* 113 */
new tagLunarCal( 28, 6, 2, 5, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0 ),
new tagLunarCal( 47, 0, 3, 10, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1 ),
new tagLunarCal( 36, 0, 4, 15, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1 ),
new tagLunarCal( 25, 5, 5, 20, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ), /* 117 */
new tagLunarCal( 43, 0, 0, 26, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ),
new tagLunarCal( 32, 0, 1, 31, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0 ),
new tagLunarCal( 22, 3, 2, 36, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0 ) ];


/* 民國年每月之日數 */
SolarCal = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];

/* 民國年每月之累積日數, 平年與閏年 */
SolarDays = [
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 ];
AnimalIdx = ["馬", "羊", "猴", "雞", "狗", "豬", "鼠", "牛", "虎", "兔", "龍", "蛇" ];
LocationIdx = [ "南", "東", "北", "西" ];

if ( SolarYear <= FIRSTYEAR || SolarYear > LASTYEAR ) return 1;

sm = SolarMonth - 1;

if ( sm < 0 || sm > 11 ) return 2;

leap = GetLeap( SolarYear );

if ( sm == 1 )
d = leap + 28;
else
d = SolarCal[sm];

if ( SolarDate < 1 || SolarDate > d ) return 3;

y = SolarYear - FIRSTYEAR;
acc = SolarDays[ leap*14 + sm ] + SolarDate;
kc = acc + LunarCal[y].BaseKanChih;
Kan = kc % 10;
Chih = kc % 12;
Location = LocationIdx[kc % 4];
Age = kc % 60;
if ( Age < 24 )
Age = 25 - Age;
else
Age = 85 - Age;

Animal = AnimalIdx[ Chih ];

if ( acc <= LunarCal[y].BaseDays ) {
y--;
LunarYear = SolarYear - 1;
leap = GetLeap( LunarYear );
sm += 12;
acc = SolarDays[leap*14 + sm] + SolarDate;
}
else
LunarYear = SolarYear;

l1 = LunarCal[y].BaseDays;
for ( i=0; i<13; i++ ) {
l2 = l1 + LunarCal[y].MonthDays[i] + 29;
if ( acc <= l2 ) break;
l1 = l2;
}

LunarMonth = i + 1;
LunarDate = acc - l1;
im = LunarCal[y].Intercalation;

if ( im != 0 && LunarMonth > im ) {
LunarMonth--;
if ( LunarMonth == im ) LunarMonth = -im;
}

if ( LunarMonth > 12 ) LunarMonth -= 12;
today=new Date();
function initArray(){
this.length=initArray.arguments.length
for(var i=0;i<this.length;i++)
this[i+1]=initArray.arguments[i] }
var d=new initArray("<font color=RED>星期日</font>","<font color=#8000FF>星期一</font>","<font color=#8000FF>星期二</font>","<font color=#8000FF>星期三</font>","<font color=#8000FF>星期四</font>","<font color=#8000FF>星期五</font>","<font color=GREEN>星期六</font>");
document.write("民國 <font color=#3171b7>",today.getYear()-1911,"<font color=black> 年 </font>",today.getMonth()+1,"<font color=black> 月 </font>",today.getDate(),"<font color=black> 日 </font>"
,d[today.getDay()+1],"");
document.write( "</font><span class=d>農曆 " + LunarMonth + "月 " + LunarDate + "日</span>" );

document.write( "<span class=d><font color=RED>煞</font>" + Location + " <font color=GREEN>沖</font>" + Animal + Age + "歲</span><br>" );


return 0;
}

/* 求此民國年是否為閏年, 返回 0 為平年, 1 為閏年 */
function GetLeap( year )
{
if ( year % 400 == 0 )
return 1;
else if ( year % 100 == 0 )
return 0;
else if ( year % 4 == 0 )
return 1;
else
return 0;
}

function tagLunarCal( d, i, w, k, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13) {
this.BaseDays = d; /* 到民國 1 月 1 日到農曆正月初一的累積日數 */
this.Intercalation = i; /* 閏月月份. 0==此年沒有閏月 */
this.BaseWeekday = w; /* 此年民國 1 月 1 日為星期幾再減 1 */
this.BaseKanChih = k; /* 此年民國 1 月 1 日之干支序號減 1 */
this.MonthDays = [ m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13 ]; /* 此農曆年每月之大小, 0==小月(29日), 1==大月(30日) */
}

//-->

CalConv();

<!--
function OpenWin( url ) {
return window.open( url, 'coop', 'width=320,height=350,toolbar=0,location=0,directories=0,status=0,menuBar=0,scrollBars=0,resizable=1' );
}
//-->



附檔內是一個Excel農曆控件,可顯示農曆年份日期生肖及節氣但因是簡體字在繁體Excel中有些字可能沒有辦法正常顯示,不知是否有高手可以反編譯此.ocx檔成繁體,
要使用此控件須在VBA中先引用calendar.ocx檔

http://www.excelhelp.net/non-cgi/usr/8/8_292_5.zip
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
向 psac 送花的會員:
WCC1212 (2010-10-03)
感謝您發表一篇好文章