写了一个FLASH农历日期类.

对农历算法研究几天,发现算法其实不是难事,关键是有一个农历每年大小月以及闰月的数据.
贴上代码,有兴趣的朋友可以看看.
我这里是只直继承DATE类.(转载请注明出处)

LunarCalendar.as下载

class LunarCalendar extends Date {

/*

1900-2100两百年的农历.

制作:dansion/dansion.com,dansion@163.com

/////////////////////////

初例化方法和FLASH的Date类相同.无参数为系统当然日期.

getCYear() 中国农历年.

getCMonth() 中国农历月.

getCDay();中国农历日.

getNianZhu();年柱

getYueZhu();月柱

getRiZhu();白柱

getShi();时辰

getJie();二十四节气

//////////////////////////*/

private var lunarInfo = new Array(0×4bd8, 0×4ae0, 0xa570, 0×54d5, 0xd260, 0xd950, 0×5554, 0×56af, 0×9ad0, 0×55d2, 0×4ae0, 0xa5b6, 0xa4d0, 0xd250, 0xd255, 0xb54f, 0xd6a0, 0xada2, 0×95b0, 0×4977, 0×497f, 0xa4b0, 0xb4b5, 0×6a50, 0×6d40, 0xab54, 0×2b6f, 0×9570, 0×52f2, 0×4970, 0×6566, 0xd4a0, 0xea50, 0×6a95, 0×5adf, 0×2b60, 0×86e3, 0×92ef, 0xc8d7, 0xc95f, 0xd4a0, 0xd8a6, 0xb55f, 0×56a0, 0xa5b4, 0×25df, 0×92d0, 0xd2b2, 0xa950, 0xb557, 0×6ca0, 0xb550, 0×5355, 0×4daf, 0xa5b0, 0×4573, 0×52bf, 0xa9a8, 0xe950, 0×6aa0, 0xaea6, 0xab50, 0×4b60, 0xaae4, 0xa570, 0×5260, 0xf263, 0xd950, 0×5b57, 0×56a0, 0×96d0, 0×4dd5, 0×4ad0, 0xa4d0, 0xd4d4, 0xd250, 0xd558, 0xb540, 0xb6a0, 0×95a6, 0×95bf, 0×49b0, 0xa974, 0xa4b0, 0xb27a, 0×6a50, 0×6d40, 0xaf46, 0xab60, 0×9570, 0×4af5, 0×4970, 0×64b0, 0×74a3, 0xea50, 0×6b58, 0×5ac0, 0xab60, 0×96d5, 0×92e0, 0xc960, 0xd954, 0xd4a0, 0xda50, 0×7552, 0×56a0, 0xabb7, 0×25d0, 0×92d0, 0xcab5, 0xa950, 0xb4a0, 0xbaa4, 0xad50, 0×55d9, 0×4ba0, 0xa5b0, 0×5176, 0×52bf, 0xa930, 0×7954, 0×6aa0, 0xad50, 0×5b52, 0×4b60, 0xa6e6, 0xa4e0, 0xd260, 0xea65, 0xd530, 0×5aa0, 0×76a3, 0×96d0, 0×4afb, 0×4ad0, 0xa4d0, 0xd0b6, 0xd25f, 0xd520, 0xdd45, 0xb5a0, 0×56d0, 0×55b2, 0×49b0, 0xa577, 0xa4b0, 0xaa50, 0xb255, 0×6d2f, 0xada0, 0×4b63, 0×937f, 0×49f8, 0×4970, 0×64b0, 0×68a6, 0xea5f, 0×6b20, 0xa6c4, 0xaaef, 0×92e0, 0xd2e3, 0xc960, 0xd557, 0xd4a0, 0xda50, 0×5d55, 0×56a0, 0xa6d0, 0×55d4, 0×52d0, 0xa9b8, 0xa950, 0xb4a0, 0xb6a6, 0xad50, 0×55a0, 0xaba4, 0xa5b0, 0×52b0, 0xb273, 0×6930, 0×7337, 0×6aa0, 0xad50, 0×4b55, 0×4b6f, 0xa570, 0×54e4, 0xd260, 0xe968, 0xd520, 0xdaa0, 0×6aa6, 0×56df, 0×4ae0, 0xa9d4, 0xa4d0, 0xd150, 0xf252, 0xd520);

private var solarMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

private var Gan = new Array(”甲”, “乙”, “丙”, “丁”, “戊”, “己”, “庚”, “辛”, “壬”, “癸”);

private var Zhi = new Array(”子”, “丑”, “寅”, “卯”, “辰”, “巳”, “午”, “未”, “申”, “酉”, “戌”, “亥”);

private var Animals = new Array(”鼠”, “牛”, “虎”, “兔”, “龙”, “蛇”, “马”, “羊”, “猴”, “鸡”, “狗”, “猪”);

private var solarTerm = new Array(”小寒”, “大寒”, “立春”, “雨水”, “惊蛰”, “春分”, “清明”, “谷雨”, “立夏”, “小满”, “芒种”, “夏至”, “小暑”, “大暑”, “立秋”, “处暑”, “白露”, “秋分”, “寒露”, “霜降”, “立冬”, “小雪”, “大雪”, “冬至”);

private var sTermInfo = new Array(0, 21208, 42467, 63836, 85337, 107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343, 285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795, 462224, 483532, 504758);

private var nStr1 = new Array(’日’, ‘一’, ‘二’, ‘三’, ‘四’, ‘五’, ‘六’, ‘七’, ‘八’, ‘九’, ‘十’);

private var nStr2 = new Array(’初’, ‘十’, ‘廿’, ‘卅’, ‘□’);

private var monthName = new Array(”JAN”, “FEB”, “MAR”, “APR”, “MAY”, “JUN”, “JUL”, “AUG”, “SEP”, “OCT”, “NOV”, “DEC”);

private var cyear:Number;

private var cmonth:Number;

private var cday:Number;

private var isLeap:Boolean;

private var nianzhu:String;

private var yuezhu:String;

private var rizhu:String;

private var jie:String;

private var shengxiao:String;

public function LunarCalendar(yearOrTimevalue:Number, month:Number, date:Number, hour:Number, minute:Number, second:Number, millisecond:Number) {

super(yearOrTimevalue, month, date, hour, minute, second, millisecond);

var leap:Number = 0;

var temp:Number = 0;

var y:Number, m:Number, d;

Number;

y = getFullYear();

m = getMonth();

d = getDate();

var offset = (Date.UTC(y, m, d)-Date.UTC(1900, 0, 31))/86400000;

for (var i = 1900; i<2100 && offset>0; i++) {

temp = lYearDays(i);

offset -= temp;

}

if (offset<0) {

offset += temp;

i–;

}

cyear = i;

leap = leapMonth(i);

//闰哪个月

isLeap = false;

for (var i = 1; i<13 && offset>0; i++) {

//闰月

if (leap>0 && i == (leap+1) && isLeap == false) {

–i;

isLeap = true;

temp = leapDays(cyear);

} else {

temp = monthDays(cyear, i);

}

//解除闰月

if (isLeap == true && i == (leap+1)) {

isLeap = false;

}

offset -= temp;

}

if (offset == 0 && leap>0 && i == leap+1) {

if (isLeap) {

isLeap = false;

} else {

isLeap = true;

–i;

}

}

if (offset<0) {

offset += temp;

–i;

}

cmonth = i;

cday = offset+1;

//算天干地支——————-

var cY, cM, cD,cA;

//年柱,月柱,日柱

if (m<2) {

cY = cyclical(y-1900+36-1);

cA=cAnimal(y-1900+36-1);

} else {

cY = cyclical(y-1900+36);

cA=cAnimal(y-1900+36);

}

cM = cyclical((y-1900)*12+m+12);

//———————————————-

var tmp1 = sTerm(y, m*2);

//节气

var tmp2 = sTerm(y, m*2+1);

if (d == tmp1) {

jie = solarTerm[m*2];

} else {

if (d == tmp2) {

jie = solarTerm[m*2+1];

} else {

jie = “”;

}

}

//节气

this.jie = jie;

//trace(”节”+tmp2+jie2);

//———————————————

var term2 = sTerm(y, 2);

//立春日期

var firstNode = sTerm(y, m*2);

//返回当月「节」为几日开始

//依节气调整二月分的年柱, 以立春为界

if (m == 1 && d>=term2) {

cY = cyclical(y-1900+36);

cA=cAnimal(y-1900+36);

//trace(”新年柱”+cY);

}

//依节气月柱, 以「节」为界

if ((d+1)>=firstNode) {

cM = cyclical((y-1900)*12+m+13);

}

//日柱

//1900/1/1与 1970/1/1 相差25567日, 1900/1/1 日柱为甲戌日(60进制10)

var dayCyclical = Date.UTC(y, m, 1, 0, 0, 0, 0)/86400000+25567+10;

cD = cyclical(dayCyclical+d-1);

//————————————————–

nianzhu = cY;

yuezhu = cM;

rizhu = cD;

shengxiao=cA;

}

public function getCYear():Number {

return cyear;

}

public function getCMonth():Number {

return cmonth;

}

public function getCDay():Number {

return cday;

}

public function getNianZhu():String {

return nianzhu;

}

public function getYueZhu():String {

return yuezhu;

}

public function getRiZhu():String {

return rizhu;

}

public function getJie():String {

return jie;

}

public function getShengXiao():String {

return shengxiao;

}

public function getShi():String {

return Zhi[Math.round((getHours()%23)/2)]+”时”;

//return getHours()+”时”;

}

//返回农历 y年的总天数

private function lYearDays(y) {

var sum:Number = 348;

for (var i = 0×8000; i>0×8; i >>= 1) {

sum += (lunarInfo[y-1900] & i) ? 1 : 0;

}

return (sum+leapDays(y));

}

//返回农历 y年闰月的天数

private function leapDays(y) {

if (leapMonth(y)) {

return ((lunarInfo[y-1899] & 0xf) == 0xf ? 30 : 29);

} else {

return (0);

}

}

//返回农历 y年闰哪个月 1-12 , 没闰返回 0

private function leapMonth(y) {

var lm = lunarInfo[y-1900] & 0xf;

return (lm == 0xf ? 0 : lm);

}

//返回农历 y年m月的总天数

private function monthDays(y, m) {

return ((lunarInfo[y-1900] & (0×10000 >> m)) ? 30 : 29);

}

//某年的第n个节气为几日(从0小寒起算)

private function sTerm(y, n) {

var offDate = new Date((31556925974.7*(y-1900)+sTermInfo[n]*60000)+Date.UTC(1900, 0, 6, 2, 5));

return (offDate.getUTCDate());

}

//返回公历 y年某m+1月的天数

private function solarDays(y, m) {

if (m == 1) {

return (((y%4 == 0) && (y%100 != 0) || (y%400 == 0)) ? 29 : 28);

} else {

return (solarMonth[m]);

}

}

//传入 offset 返回干支, 0=甲子

private function cyclical(num) {

return (Gan[num%10]+Zhi[num%12]);

}

private function cAnimal(num) {

return (Animals[num%12]);

}

}

Tags: , ,

3 Responses to “写了一个FLASH农历日期类.”

  1. kenis 说:

    在天地会看到博主的农历类,特地来这里感谢博主~

  2. tms 说:

    as3 已经不支持扩展date了,悲剧了

  3. 叮叮 说:

    学习

Leave a Reply