package utils { public class TimeAlarm { static private var _instance:TimeAlarm;//使用单例模式 private var _timeSourceFunc:Function; /** *闹铃管理器 * */ public function TimeAlarm() { if(_instance!=null) throw "TimeAlarm is single instance class." } static public function get instance():TimeAlarm { if(_instance==null) { _instance = new TimeAlarm(); } return _instance; } /** *在帧循环中调用 * @param time * */ public function alarmTick(time:Number=NaN):void { var date:Date; var day:int; if(isNaN(time)==true) { date = new Date(); }else{ date = new Date(time); } var monthly_key:String = ""; var weekly_key:String = ""; var daily_key:String = ""; //每月 键值 if(date.month<9) { monthly_key += "0"; } monthly_key += String(date.month+1); if(date.date<10) { monthly_key += "0"; } monthly_key += String(date.date); //每周 键值 if(date.day==0) { monthly_key = monthly_key + "07"; weekly_key = weekly_key + "07"; day = 7; }else{ monthly_key = monthly_key + "0" + String(date.day); weekly_key = weekly_key + "0" + String(date.day); day = date.day; } //每时 键值 if(date.hours<10) { monthly_key += "0"; weekly_key += "0"; daily_key += "0"; } monthly_key += String(date.hours); weekly_key += String(date.hours); daily_key += String(date.hours); if(date.minutes<10) { monthly_key += "0"; weekly_key += "0"; daily_key += "0"; } monthly_key +=String(date.minutes); weekly_key +=String(date.minutes); daily_key +=String(date.minutes); if(date.seconds<10) { monthly_key += "0"; weekly_key += "0"; daily_key += "0"; } monthly_key +=String(date.seconds); weekly_key +=String(date.seconds); daily_key +=String(date.seconds); if(_alarms!=null) { var type_alarms:Array; var final_key:String; for (var type:String in _alarms) { type_alarms = _alarms[type]; switch(int(type)) { case ALARM_WEEKLY: { final_key = weekly_key; break; } case ALARM_DAiLY: { final_key = daily_key; break; } } var alarm:Object; var alarms:Array; //正点提醒 for (var k:String in type_alarms) { alarms = type_alarms[k]; if(k==final_key) { for each(alarm in alarms) { if(alarm.alarm is Function) { alarm.alarm(alarm); alarm.alarmed = true; } } }else{ for each(alarm in alarms) { //超出正点,但是还在范围内 if(alarm.range!=null && alarm.alarmed==false) { //先只算周提醒的 if((alarm.w==null || alarm.w==day) && alarm.h==date.hours)// { var end_min:int = int(alarm.min)+int(alarm.range); var start_min:int = int(alarm.min); var start_s:int = int(alarm.s); var in_range:Boolean = false; if(end_min>date.minutes)//结束时间比当前时间晚 { if(start_min==date.minutes)//如果刚好是开始分数 { if(start_s<date.seconds)//看看是不是当前时间过了正点 { in_range = true; } }else if(start_min<date.minutes)//如果过了开始分数 { in_range = true; } }else if(end_min==date.minutes)//如果当前时间赶上了结束时间 { if(start_s>date.seconds)//秒数还在范围内 { in_range = true; } } if(in_range==true) { alarm.alarmed = true; alarm.alarm(alarm); } } } } } } } } } private const KEYS:Array = ["m", "d", "w", "h", "min", "s"]; //类型和KEYS里的属性索引是对应的 private const ALARM_WEEKLY:int = 2;//每周 private const ALARM_DAiLY:int = 3;//每日 private var _alarms:Array; /** * @param alarm {m:1~12, d:1~31, w:1~7, h:0~23, min:0~60, s:0~60, range:xx, alarm:call back function } 各自意义 月 日 周(1~7) 时 分 秒 * range:{min:0<=min<60; s:0<=s<60} 从起始时间开始,指定时间范围内都有效,单位分;alarm:回调函数 * */ public function addAlarm(alarm:Object):void { var alarm_type:int = -1; //这里的判断要从大到小,比如扩展了每月类型的就要先判断月,顺序依次是 每年>每月>每周>每天 if(alarm.hasOwnProperty("w")==true && alarm.w>0) { alarm_type = ALARM_WEEKLY; }else if(alarm.hasOwnProperty("h")==true) { alarm_type = ALARM_DAiLY; } if(alarm_type>=0) { formatAlarm(alarm, alarm_type); } } private function formatAlarm(alarm:Object, alarmType:int):void { var finale_key:String = ""; for(var i:int = alarmType; i < KEYS.length; ++i) { var key:String = KEYS[i]; if(alarm[key]!=null) { if(alarm[key]<10) { finale_key += "0"; } finale_key += String(alarm[key]); }else{ finale_key += "00"; } } if(_alarms==null) { _alarms = new Array(); } if(_alarms[alarmType]==null) { _alarms[alarmType] = new Array(); } if(_alarms[alarmType][finale_key]==null) { _alarms[alarmType][finale_key] = new Array(); } alarm.alarmed = false; _alarms[alarmType][finale_key].push(alarm); } } }