Flex之日历,农历

时间:2022-05-27 00:21:04

ChineseDate.as

package liuyou.util
{
import mx.formatters.DateFormatter;

/**
* 计算阴历.
* <code>new ChineseDate(new Date()).date</code>
* @Author liuyou<you.liu@gmail.com>
* */
public class ChineseDate
{
/*天干名称*/
public const arrTianGan:Array=["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"];
/*地支名称*/
public const arrDiZhi:Array=["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"];
/*属相名称*/
public const arrShuXiang:Array=["鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"];
/*农历日期名*/
public const arrDayName:Array=["*", "初一", "初二", "初三", "初四", "初五", "初六", "初七", "初八", "初九", "初十", "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十", "廿一", "廿二", "廿三", "廿四", "廿五", "廿六", "廿七", "廿八", "廿九", "三十"];
/*农历月份名*/
public const arrMonName:Array=["*", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "腊"];

/*公历每月前面的天数*/
public const arrMonthAdd:Array=[0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
/*农历数据*/
public const arrNongliData:Array=[2635, 333387, 1701, 1748, 267701, 694, 2391, 133423, 1175, 396438, 3402, 3749, 331177, 1453, 694, 201326, 2350, 465197, 3221, 3402, 400202, 2901, 1386, 267611, 605, 2349, 137515, 2709, 464533, 1738, 2901, 330421, 1242, 2651, 199255, 1323, 529706, 3733, 1706, 398762, 2741, 1206, 267438, 2647, 1318, 204070, 3477, 461653, 1386, 2413, 330077, 1197, 2637, 268877, 3365, 531109, 2900, 2922, 398042, 2395, 1179, 267415, 2635, 661067, 1701, 1748, 398772, 2742, 2391, 330031, 1175, 1611, 200010, 3749, 527717, 1452, 2742, 332397, 2350, 3222, 268949, 3402, 3493, 133973, 1386, 464219, 605, 2349, 334123, 2709, 2890, 267946, 2773, 592565, 1210, 2651, 395863, 1323, 2707, 265877];

private var _date:Date;

public function ChineseDate(date:Date=null)
{
this._date=date || new Date();
}

//根据日期获取星期
public function getChinaTimeDate(date:Date):String
{
var strChinaTime:String = "";
var chinaDateFormat:DateFormatter = new DateFormatter();

var pattern:String = "YYYY-MM-DD";
chinaDateFormat.formatString=pattern;

var formatedDate:String = chinaDateFormat.format(date);
var weekPattern:String= "EEE";
chinaDateFormat.formatString=weekPattern;
var formatedWeek:String = chinaDateFormat.format(date);
//strChinaTime = formatedDate;
switch ( formatedWeek)
{
case "Mon":
formatedWeek = "星期一";
break;
case "Tue":
formatedWeek = "星期二";
break;
case "Wed":
formatedWeek = "星期三";
break;
case "Thu":
formatedWeek = "星期四";
break;
case "Fri":
formatedWeek = "星期五";
break;
case "Sat":
formatedWeek = "星期六";
break;
case "Sun":
formatedWeek = "星期日";
break;
}
strChinaTime = " " + formatedWeek;
return strChinaTime;
}



public function get date():String
{
var wCurYear:Number, wCurMonth:Number, wCurDay:Number;
var nTheDate:int, nIsEnd:int, m:int, k:int, n:int, i:int, nBit:int;
var szNongli:String, szNongliDay:String, szShuXiang:String;
/*---取当前公历年、月、日---*/
wCurYear=_date.fullYear;
wCurMonth=_date.month + 1;
wCurDay=_date.date;
/*---计算到初始时间1921年2月8日的天数:1921-2-8(正月初一)---*/
nTheDate=(wCurYear - 1921) * 365 + (wCurYear - 1921) / 4 + wCurDay + arrMonthAdd[wCurMonth - 1] - 38;
if ((!(wCurYear % 4)) && (wCurMonth > 2))
nTheDate=nTheDate + 1;

/*--计算农历天干、地支、月、日---*/
nIsEnd=0;
m=0;
while (nIsEnd != 1)
{
if (arrNongliData[m] < 4095)
k=11;
else
k=12;
n=k;
while (n >= 0)
{
//获取arrNongliData(m)的第n个二进制位的值
nBit=arrNongliData[m];
for (i=1; i < n + 1; i++)
nBit=nBit / 2;

nBit=nBit % 2;

if (nTheDate <= (29 + nBit))
{
nIsEnd=1;
break;
}

nTheDate=nTheDate - 29 - nBit;
n=n - 1;
}
if (nIsEnd)
break;
m=m + 1;
}
wCurYear=1921 + m;
wCurMonth=k - n + 1;
wCurDay=nTheDate;
if (k == 12)
{
if (wCurMonth == arrNongliData[m] / 65536 + 1)
wCurMonth=1 - wCurMonth;
else if (wCurMonth > arrNongliData[m] / 65536 + 1)
wCurMonth=wCurMonth - 1;
}

/*--生成农历天干、地支、属相 ==> wNongli--*/
szNongli=StringTools.format("%0(%1%2)年", arrShuXiang[((wCurYear - 4) % 60) % 12], arrTianGan[((wCurYear - 4) % 60) % 10], arrDiZhi[((wCurYear - 4) % 60) % 12]);

/*--生成农历月、日 ==> wNongliDay--*/
if (wCurMonth < 1)
{
szNongliDay=StringTools.format("闰%0月%1", arrMonName[-1 * wCurMonth], arrDayName[wCurDay]);
}
else
{
szNongliDay=StringTools.format("%0月%1", arrMonName[wCurMonth], arrDayName[wCurDay]);
}
return szNongli + szNongliDay;

}



}


}

StringTools.as

package liuyou.util
{

/**
* @Author liuyou<you.liu@gmail.com>
* */
public class StringTools
{
public function StringTools()
{
trace("can't instanced.");
}

/**
* <code>String.format("hello %0, i don't love %1!", "Kitty", "Jimmy")</code>
* will return "hello Kitty, i don't lve Jimmy!".
*
* */

public static function format(pattern:String, ... args):String
{
return pattern.replace(/\%(\d)/g, function():String
{
return args[Number(arguments[1])];
});
}
}
}



使用的地方使用之:

txtTime.text=StringTools.format(new ChineseDate(new Date()).date);

获取日期:

var dateFormatter:DateFormatter = new  DateFormatter();
dateFormatter.formatString = "YYYY-MM-DD "; //JJ:NN:SS
var now:String= dateFormatter.format(new Date());

获取时间:动态在走:

internal function onTick(evt:TimerEvent):void{
var second:String;
var minute:String;
var hour:String;
clear();
currDate = new Date();
createHands();
showTime(currDate);
if (currDate.getHours()<10) { hour="0"+ currDate.getHours()} else { hour=""+currDate.getHours()};
if (currDate.getMinutes()<10) { minute="0"+ currDate.getMinutes()} else { minute=""+currDate.getMinutes()};
if (currDate.getSeconds()<10) { second="0"+ currDate.getSeconds()} else { second=""+currDate.getSeconds()};


currTimePannel.text=hour+":"+minute+":"+second;
}


时间定时器:

_timer = new Timer(1000);
_timer.addEventListener(TimerEvent.TIMER,onTick)
_timer.start();

这样时间就在不停的走动,并且按1s 的时间走。