成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

當前位置:首頁>>開發編程>>綜合開發>>新聞內容
用JScript實現公歷到農歷的日期轉換
作者:bhw98@CSDN 發布時間:2004-3-9 15:53:47 文章來源:西部E網

本文介紹了用查表法實現的公歷到農歷日期轉換的方法,給出了實用的JScript腳本。可接受的公歷日期范圍是2001-1-1至2050-12-31。

// 數組LunarDaysOfMonth存入農歷2001年到2050年每年中的月天數信息
// 農歷每月只能是29或30天,一年用12(或13)個二進制位表示,從高到低,對應位為1表示30天,否則29天 
var LunarDaysOfMonth = new Array
(
    0xd4a8, 0xd4a0, 0xda50, 0x5aa8, 0x56a0, 0xaad8, 0x25d0, 0x92d0, 0xc958, 0xa950, // 2001-2010 
    0xb4a0, 0xb550, 0xb550, 0x55a8, 0x4ba0, 0xa5b0, 0x52b8, 0x52b0, 0xa930, 0x74a8, // 2011-2020 
    0x6aa0, 0xad50, 0x4da8, 0x4b60, 0x9570, 0xa4e0, 0xd260, 0xe930, 0xd530, 0x5aa0, // 2021-2030 
    0x6b50, 0x96d0, 0x4ae8, 0x4ad0, 0xa4d0, 0xd258, 0xd250, 0xd520, 0xdaa0, 0xb5a0, // 2031-2040 
    0x56d0, 0x4ad8, 0x49b0, 0xa4b8, 0xa4b0, 0xaa50, 0xb528, 0x6d20, 0xada0, 0x55b0  // 2041-2050 
);
 
// 數組LunarLeapYear存放農歷2001年到2050年閏月的月份,如沒有則為0,從高到低,每字節存兩年 
var LunarLeapYear = new Array
(
    0x40, 0x02, 0x07, 0x00, 0x50, // 2001-2010 
    0x04, 0x09, 0x00, 0x60, 0x04, // 2011-2020 
    0x00, 0x20, 0x60, 0x05, 0x00, // 2021-2030 
    0x30, 0xb0, 0x06, 0x00, 0x50, // 2031-2040 
    0x02, 0x07, 0x00, 0x50, 0x03  // 2041-2050 
);
 
 
// 返回農歷iLunarYear年的閏月月份,如沒有則返回0 
function GetLeapMonth(iLunarYear)
{ 
    var Leap = LunarLeapYear[(iLunarYear - 2001) >> 1];
    return (((iLunarYear - 2001) & 1) == 0) ? (Leap >> 4) : (Leap & 0x0f);
} 
 
// 返回農歷iLunarYer年iLunarMonth月的天數,結果是一個長整數
// 如果iLunarMonth不是閏月, 高字為0,低字為該月的天數
// 如果iLunarMonth是閏月, 高字為后一個月的天數,低字為前一個月的天數
function LunarMonthDays(iLunarYear, iLunarMonth)
{ 
    var High;
    var Low;
    var Bit;
 
    High = 0;
    Low = 29;
    Bit = 16 - iLunarMonth;
    if ((iLunarMonth > GetLeapMonth(iLunarYear)) && (GetLeapMonth(iLunarYear) > 0))  Bit--;
    if ((LunarDaysOfMonth[iLunarYear - 2001] & (1 << Bit)) > 0)  Low++;
    if (iLunarMonth == GetLeapMonth(iLunarYear))
    {
        High = ((LunarDaysOfMonth[iLunarYear - 2001] & (1 << (Bit-1))) > 0) ?  30 : 29;
    }
 
    return Low + (High << 16);
} 
 
// 返回農歷iLunarYear年的總天數
function LunarYearDays(iLunarYear)
{ 
    var Days;
    var tmp;
 
    Days = 0;
    for (var i=1; i <= 12; i++)
    {
        tmp = LunarMonthDays(iLunarYear, i);
        Days = Days + ((tmp >> 16) & 0xffff); //取高位 
        Days = Days + (tmp & 0xffff); //取低位 
    }
 
    return Days;
} 
 
// 將農歷iLunarYear年格式化成天干地支記年法表示的字符串 
function FormatLunarYear(iLunarYear)
{ 
    var szText1 = new String("甲乙丙丁戊己庚辛壬癸");
    var szText2 = new String("子丑寅卯辰巳午未申酉戌亥");
    var strYear;
  
    strYear = szText1.substr((iLunarYear - 4) % 10, 1);
    strYear = strYear + szText2.substr((iLunarYear - 4) % 12, 1);
 
    return strYear + "年";
}
 
// 將農歷iLunarMonth月格式化成農歷表示的字符串
function FormatLunarMonth(iLunarMonth)
{ 
    var szText = new String("正二三四五六七八九十");
    var strMonth;
 
    if (iLunarMonth <= 10)
    {
        strMonth = szText.substr(iLunarMonth - 1, 1);
    }
    else if (iLunarMonth == 11) strMonth = "十一";
    else strMonth = "十二";
 
    return strMonth + "月";
} 
 
// 將農歷iLunarDay日格式化成農歷表示的字符串
function FormatLunarDay(iLunarDay)
{ 
    var szText1 = new String("初十廿三");
    var szText2 = new String("一二三四五六七八九十");
    var strDay;
    if ((iLunarDay != 20) && (iLunarDay != 30))
    {
        strDay = szText1.substr((iLunarDay - 1) / 10, 1) + szText2.substr((iLunarDay - 1) % 10, 1);
    }
    else if (iLunarDay != 20)
    {
        strDay = szText1.substr(iLunarDay / 10, 1) + "十";
    }
    else
    {
        strDay = "二十";
    }
  
    return strDay;
} 
 
// 將公歷日期轉換為農歷日期,返回農歷表示的字符串
function GetLunarDateString(SolarDate)
{
    var tmp;
    var iLunarYear;
    var iLunarMonth;
    var iLunarDay;
    var Leap = false;
    var MinMilli = 1000 * 60;
    var HrMilli = MinMilli * 60;
    var DyMilli = HrMilli * 24;
  
    // 從2001年1月1日算起,給定的公歷日期已經過去的天數
    // 11323是1970年1月1日到2001年1月1日之間的天數,因為Date是從1970年1月1日作為起點的
    var iSpanDays = Math.round(SolarDate.getTime() / DyMilli) - 11323;
 
    // 公歷2001年1月24日為農歷2001年正月初一,差23天
    if (iSpanDays < 23)
    {
        iYear = 2000;
        iLunarMonth = 12;
        iLunarDay = iSpanDays + 7;
    }
    else
    {
        // 從農歷2001年正月初一算起 
        iSpanDays = iSpanDays - 23;
        iLunarYear = 2001;
        iLunarMonth = 1;
        iLunarDay = 1;
  
        // 計算農歷年 
        tmp = LunarYearDays(iLunarYear);
        while (iSpanDays >= tmp)
        {
            iSpanDays -= tmp;
            iLunarYear++;
            tmp = LunarYearDays(iLunarYear);
        }
 
        // 計算農歷月 
        tmp = LunarMonthDays(iLunarYear, iLunarMonth) & 0xffff; //取低字
        while (iSpanDays >= tmp)
        {
            iSpanDays -= tmp;
            if (iLunarMonth == GetLeapMonth(iLunarYear))  // 該年該月閏月
            {
                tmp = LunarMonthDays(iLunarYear, iLunarMonth) >> 16; //取高字
                if (iSpanDays < tmp)
                {
                    Leap = (tmp > 0) ? true : false;  // 閏月的后個月?
                    break;
                }
                iSpanDays = iSpanDays - tmp;
            }
  
            iLunarMonth++;
            tmp = LunarMonthDays(iLunarYear,iLunarMonth) & 0xffff; //取低字
        }
  
        // 計算農歷日 
        iLunarDay += iSpanDays;
    }
  
    return FormatLunarYear(iLunarYear) + (Leap ? "閏" : "") + FormatLunarMonth(iLunarMonth) + FormatLunarDay(iLunarDay);
}

調用方法舉例如下:

var today= new Date();   // 今天是2004-3-5
var str = GetLunarDateString(today);

結果是 “甲申年二月十五”。

再舉兩個例子:

var date1 = new Date(2008, 9, 1);     // 2008-10-1
var date2 = new Date(2050, 4, 18);    // 2050-5-18
var str1 = GetLunarDateString(date1);
var str2 = GetLunarDateString(date2);

結果分別是 “戊子年九月初三” 和 “庚午年閏三月廿八”。

注意在Date中,月的范圍是0-11。

[相關資源]

  • 科腦工作室(Kernel Studio):www.kernelstudio.com

    發布日期: 2004-03-05

     



  • 最新更新
    ·wml中頁面自動跳轉的實現方法
    ·Alexa排名數據接口的簡要介紹
    ·利用U盤進行軟件加密的方法(VB)
    ·優秀程序員的十個習慣
    ·項目管理:如何逃離垃圾客戶
    ·QQ2009去廣告部分核心源代碼
    ·讓程序更容易理解:13個代碼注釋的小技
    ·nx1和nx2后綴名是什么數據庫文件?
    ·正則表達式符號解釋大全
    ·什么是RIA?介紹幾種RIA客戶端開發技術
    相關信息
    畫心
    愚愛
    偏愛
    火苗
    白狐
    畫沙
    犯錯
    歌曲
    傳奇
    稻香
    小酒窩
    獅子座
    小情歌
    全是愛
    棉花糖
    海豚音
    我相信
    甩蔥歌
    這叫愛
    shero
    走天涯
    琉璃月
    Nobody
    我愛他
    套馬桿
    愛是你我
    最后一次
    少女時代
    灰色頭像
    斷橋殘雪
    美了美了
    狼的誘惑
    我很快樂
    星月神話
    心痛2009
    愛丫愛丫
    半城煙沙
    旗開得勝
    郎的誘惑
    愛情買賣
    2010等你來
    我叫小沈陽
    i miss you
    姑娘我愛你
    我們都一樣
    其實很寂寞
    我愛雨夜花
    變心的玫瑰
    犀利哥之歌
    你是我的眼
    你是我的OK繃
    貝多芬的悲傷
    哥只是個傳說
    丟了幸福的豬
    找個人來愛我
    要嫁就嫁灰太狼
    如果這就是愛情
    我們沒有在一起
    寂寞在唱什么歌
    斯琴高麗的傷心
    別在我離開之前離開
    不是因為寂寞才想你
    愛上你等于愛上了錯
    在心里從此永遠有個你
    一個人的寂寞兩個人的錯
    主站蜘蛛池模板: 星子县| 涪陵区| 莫力| 苍山县| 丰都县| 香河县| 南宫市| 福贡县| 固阳县| 高邑县| 丰城市| 衢州市| 丹阳市| 自治县| 大英县| 云浮市| 珠海市| 翼城县| 镇平县| 新营市| 嘉定区| 彰化县| 岱山县| 绥棱县| 新田县| 慈利县| 社会| 临江市| 霞浦县| 荔波县| 克东县| 苏州市| 额济纳旗| 神木县| 大姚县| 恩施市| 塔城市| 邛崃市| 新竹市| 依安县| 五台县|