您当前的位置是:首页-flash as2.0

一个日历的类(AS2.0),包含农历,节日,节气,生肖,天干地支等的转换方法

【发表于】:2010/10/24 19:58:00  已被访问:546次
这个地址找不回来了,似乎搜索结果并不是特别多,都是Java写的多,如果要把那个用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(0x4bd8, 0x4ae0, 0xa570, 0x54d5, 0xd260, 0xd950, 0x5554, 0x56af, 0x9ad0, 0x55d2, 0x4ae0, 0xa5b6, 0xa4d0, 0xd250, 0xd255, 0xb54f, 0xd6a0, 0xada2, 0x95b0, 0x4977, 0x497f, 0xa4b0, 0xb4b5, 0x6a50, 0x6d40, 0xab54, 0x2b6f, 0x9570, 0x52f2, 0x4970, 0x6566, 0xd4a0, 0xea50, 0x6a95, 0x5adf, 0x2b60, 0x86e3, 0x92ef, 0xc8d7, 0xc95f, 0xd4a0, 0xd8a6, 0xb55f, 0x56a0, 0xa5b4, 0x25df, 0x92d0, 0xd2b2, 0xa950, 0xb557, 0x6ca0, 0xb550, 0x5355, 0x4daf, 0xa5b0, 0x4573, 0x52bf, 0xa9a8, 0xe950, 0x6aa0, 0xaea6, 0xab50, 0x4b60, 0xaae4, 0xa570, 0x5260, 0xf263, 0xd950, 0x5b57, 0x56a0, 0x96d0, 0x4dd5, 0x4ad0, 0xa4d0, 0xd4d4, 0xd250, 0xd558, 0xb540, 0xb6a0, 0x95a6, 0x95bf, 0x49b0, 0xa974, 0xa4b0, 0xb27a, 0x6a50, 0x6d40, 0xaf46, 0xab60, 0x9570, 0x4af5, 0x4970, 0x64b0, 0x74a3, 0xea50, 0x6b58, 0x5ac0, 0xab60, 0x96d5, 0x92e0, 0xc960, 0xd954, 0xd4a0, 0xda50, 0x7552, 0x56a0, 0xabb7, 0x25d0, 0x92d0, 0xcab5, 0xa950, 0xb4a0, 0xbaa4, 0xad50, 0x55d9, 0x4ba0, 0xa5b0, 0x5176, 0x52bf, 0xa930, 0x7954, 0x6aa0, 0xad50, 0x5b52, 0x4b60, 0xa6e6, 0xa4e0, 0xd260, 0xea65, 0xd530, 0x5aa0, 0x76a3, 0x96d0, 0x4afb, 0x4ad0, 0xa4d0, 0xd0b6, 0xd25f, 0xd520, 0xdd45, 0xb5a0, 0x56d0, 0x55b2, 0x49b0, 0xa577, 0xa4b0, 0xaa50, 0xb255, 0x6d2f, 0xada0, 0x4b63, 0x937f, 0x49f8, 0x4970, 0x64b0, 0x68a6, 0xea5f, 0x6b20, 0xa6c4, 0xaaef, 0x92e0, 0xd2e3, 0xc960, 0xd557, 0xd4a0, 0xda50, 0x5d55, 0x56a0, 0xa6d0, 0x55d4, 0x52d0, 0xa9b8, 0xa950, 0xb4a0, 0xb6a6, 0xad50, 0x55a0, 0xaba4, 0xa5b0, 0x52b0, 0xb273, 0x6930, 0x7337, 0x6aa0, 0xad50, 0x4b55, 0x4b6f, 0xa570, 0x54e4, 0xd260, 0xe968, 0xd520, 0xdaa0, 0x6aa6, 0x56df, 0x4ae0, 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;
  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;
    //年柱,月柱,日柱
    if (m<2) {
      cY = cyclical(y-1900+36-1);
    } else {
      cY = cyclical(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);
      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;
  }
  public function getCYear():Number {
    return cyear;
  }
  public function getCMonth():Number {
    return cmonth;
  }
  public function getCDay():Number {
    return cday;
  }
  public function getCDate():String{
      var tempStr:String=nStr2[Math.floor(cday/10)]+nStr1[Math.floor(cday%10)];
      tempStr=tempStr.split("十日").join("初十");
      tempStr=tempStr.split("廿日").join("廿十");
      tempStr=tempStr.split("卅日").join("三十");
      return tempStr;
  }
  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 getShi():String {
    return Zhi[Math.round((getHours()%23)/2)]+"时";
    //return getHours()+"时";
  }
  //返回农历 y年的总天数
  private function lYearDays(y) {
    var sum:Number = 348;
    for (var i = 0x8000; i>0x8; 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] & (0x10000 >> 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]);
  }
}
 
上下篇: FLASH as2.0外部调用SWF Flash As2.0 一些必记函数

最新推荐信息