Ver Fonte

Added a sample to test date and time funtions and also to be the base for calendars.

mingodad há 13 anos atrás
pai
commit
2c614375d1
1 ficheiros alterados com 286 adições e 0 exclusões
  1. 286 0
      ourbiz/calendar-utils.nut

+ 286 - 0
ourbiz/calendar-utils.nut

@@ -0,0 +1,286 @@
+/*
+This code is based on https://github.com/leafo/lua-date
+
+Copyright (C) 2006, by Jas Latrix ([email protected])
+All Rights Deserved.
+use this code at your own risk!.
+keep out of reach of children.
+
+Ported and adapted to Squirrel/SquiLu by Domingo Alvarez Duarte
+*/
+
+class CalendarBase {
+	static _month_names  = [
+		"January", "February", "March", "April", "May", "June", "July",
+		"August", "September", "October", "November", "December"
+		];
+	/*
+	static _month_names  = [
+		"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
+		"Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
+		];
+	*/
+	static _month_names_abbr = [
+			"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+			"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+			];
+	/*
+	static _month_names_abbr = [
+			"Ene", "Feb", "Mar", "Abr", "May", "Jun",
+			"Jul", "Ago", "Sep", "Oct", "Nov", "Dic"
+			];
+	*/
+	static _day_names = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
+	//static _day_names = ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"];
+
+	//static _day_names_abbr = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
+	static _day_names_abbr = ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
+	//static _day_names_abbr = ["Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"];
+	//static _day_names_abbr = ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"];
+	
+	static _month_names_abbr = [
+			"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+			"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+			];
+	/*
+	static _month_names_abbr = [
+			"Ene", "Feb", "Mar", "Abr", "May", "Jun",
+			"Jul", "Ago", "Sep", "Oct", "Nov", "Dic"
+			];
+	*/
+	static _days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
+	static _seconds_in_hour = 3600;
+	static _seconds_in_day = 86400;
+	static _seconds_in_week = 604800;
+	
+	constructor(){}
+
+	function parse_hour_minutes(s){
+		local ar_t = [];
+		local function set_matches(m){ar_t.push(v.tointeger()); return true;};
+		set_matches.setenv(this);
+		s.gmatch("(%d+)", set_matches);
+		return {
+			hour = ar_t.get(0, 0),
+			minutes = ar_t.get(1, 0),
+			seconds = ar_t.get(2, 0),
+			};
+	}
+
+	function parse_day_month_year(s){
+		local ar_t = [];
+		local function set_matches(m){ar_t.push(v.tointeger()); return true;};
+		set_matches.setenv(this);
+		s.gmatch("(%d+)", set_matches);
+		local day = ar_t.get(0, 0);
+		local month = ar_t.get(1, 0);
+		local year = ar_t.get(2, 0);
+		if(day > 31){
+			local tmp = day;
+			day = year;
+			year = tmp;
+		}
+		return {day = day,	month = month, year = year,};
+	}
+
+	function parse_year_month_day(s){
+		local ar_t = [];
+		local function set_matches(m){ar_t.push(v.tointeger()); return true;};
+		set_matches.setenv(this);
+		s.gmatch("(%d+)", set_matches);
+		local year = ar_t.get(0, 0);
+		local month = ar_t.get(1, 0);
+		local day = ar_t.get(2, 0);
+		if(day > 31){
+			local tmp = day;
+			day = year;
+			year = tmp;
+		}
+		return {day = day,	month = month, year = year,};
+	}
+
+	function parse_date( value ){
+		local adate = os.date("*t");
+		if (value.len() > 0){
+			local nums = [];
+			
+			local  function set_matches(m) {nums.push(m.tointeger()); return true};
+			set_matches.setenv(this);
+
+			local setDay = function(idx){
+				local aday = nums[idx];
+				if (aday > 0 && aday < 32) adate.day = aday;
+			}
+			local setMonth = function(idx){
+				local amonth = nums[idx];
+				if (amonth > 0 && amonth < 13) adate.month = amonth-1; //zero based
+			}
+			local setYear = function(idx){
+				local ayear = nums[idx];
+				if (ayear < 100) ayear += 2000; //current milenium
+				adate.year = ayear;
+			}
+			local setHour = function(){
+				local ahour = nums[0];
+				if (ahour > 0 && ahour < 23) adate.hour = ahour;
+			}
+			local setMin = function(){
+				local amin = nums[1];
+				if (amin > 0 && amin < 60) adate.min = amin;
+			}
+			local setSec = function(){
+				local asec = nums[2];
+				if (asec > 0 && asec < 60) adate.sec = asec;
+			}
+			//print(value);
+			local avalue = value.split(" ");
+			avalue[0].gmatch("(%d+)", set_matches);
+			switch(nums.len()){
+				case 1: //day in current month
+					setDay(0);
+				break;
+				case 2: //day and month in current year
+					if (nums[1] > 12) {
+						setDay(1);
+						setMonth(0);
+					}
+					else
+					{
+						setDay(0);
+						setMonth(1);
+					}
+				break;
+				case 3:
+					if (nums[1] > 31){
+						//year and month and day
+						setYear(0);
+						setMonth(1);
+						setDay(2);
+					}
+					else
+					{
+						//day and month and year
+						if (nums[2] > 12){
+							setDay(1);
+							setMonth(0);
+						}
+						else
+						{
+							setDay(0);
+							setMonth(1);
+						}
+						setYear(2);
+					}
+				break;
+			}
+			
+			if (avalue.len() > 1){
+				nums = [];
+				avalue[1].gmatch("(%d+)",set_matches);
+				//print(nums.len(), avalue[1]);
+				
+				adate.hour = 0;
+				adate.min = 0;
+				adate.sec = 0;
+				local nl = nums.len();
+				if (nl > 0) setHour();
+				if (nl > 1) setMin();
+				if (nl > 2) setSec();
+			}
+		}
+		//foreach( k,v in adate) do print(k,v);
+		//print(os.date(os.time(adate)))
+		return adate;
+	}
+
+
+	function julian_to_unix(J){
+		// converts a julian date into unit time
+		return (J - 2440588) * 86400;
+	}
+
+	function get_julian_day(y,m,d){
+		// returns the current time in julian date format
+		local now = os.time({year=y,month=m,day=d});
+		return now / 86400.0 + 2440588;
+	}
+
+	function get_julian_now(){
+		// returns the current time in julian date format
+		local now = os.time();
+		return now / 86400.0 + 2440588;
+	}
+
+	function get_timezone_offset(){
+		// returns the number of seconds of timezone offset
+		local tz = os.date("%z").tointeger();
+		local tzh = math.floor(tz / 100 + 0.5);
+		local tzm = math.abs(tz) % 100 / 60.0;
+		if (tzh < 0) tzm *= -1;
+		return (tzh + tzm) * 3600;
+	}
+
+	function makemonth(y,m){
+		local month_array = [];
+ 		local atime = os.time({year=y,month=m,day=1});
+		local adate = os.date("*t", atime);
+		// get back to the nearest monday
+		atime -= _seconds_in_day * adate.wday;
+		adate = os.date("*t", atime);
+		if (adate.day < 7 && adate.day != 1){
+			//go back one more week
+			atime -=  _seconds_in_week;
+			adate = os.date("*t", atime);
+		}
+		do
+		{
+			local week_array = [];
+			month_array.push(week_array);
+			do
+			{
+				// insert the week days
+				week_array.push(adate.day);
+				atime += _seconds_in_day;
+				adate = os.date("*t", atime);
+			} while(adate && adate.wday != 0); // sunday
+		} while(adate && adate.month == m);
+		return month_array;
+	}
+}
+
+/*
+local html_foot = "\n</body>\n</html>\n";
+local html_head = [=[
+<html>
+<style>
+th {background:black; color: silver; vertical-align: middle;}
+td {vertical-align: middle; text-align:center;}
+td.sun {color: red;}
+td.sat {color: blue;}
+</style>
+<body>
+]=];
+local html_yearhead = "\n<table align=\"left\">";
+local html_monhead = "\n<tr><th colspan = \"7\">%s, %s</th></tr><tr><td>sun</td><td>mon</td><td>tue</td><td>wed</td><td>thu</td><td>fri</td><td>sat</td></tr>";
+local html_monweek = "\n<tr><td class=\"sun\">%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td>%d</td><td class=\"sat\">%d</td></tr>";
+local html_yearfoot = "\n</table>";
+function makecalendar(y, iox){
+	iox.write(html_yearhead);
+	for(local i = 0; i < 12; ++i){
+		local tm = CalendarBase.makemonth(y, i);
+		iox.write(format(html_monhead, CalendarBase._month_names[i], y.tostring()));
+		foreach( k, v in tm) iox.write(format(html_monweek, v[0], v[1], v[2], v[3], v[4], v[5], v[6]));
+	}
+	iox.write(html_yearfoot);
+}
+
+local outf = file("year-calendar.html", "w");
+outf.write(html_head);
+
+foreach(v in [2012,2013,2014] ){
+	local y = v.tointeger();
+	if (y) makecalendar(y, outf);
+}
+
+outf.write(html_foot);
+*/