code: purgatorio

ref: 42dfac6916ebbdac65cbec8b3e1a80c3ee41423c
dir: /appl/charon/date.b/

View raw version
implement Date;

include "common.m";
include "date.m";
include "daytime.m";
	daytime: Daytime;
	Tm: import daytime;

sys: Sys;
CU: CharonUtils;

wdayname := array[] of {
	"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
};

monname := array[] of {
	"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

init(cu: CharonUtils)
{
	sys = load Sys Sys->PATH;
	CU = cu;
	daytime = load Daytime Daytime->PATH;
	if (daytime==nil)
		raise sys->sprint("EXInternal: can't load Daytime: %r");
}

# print dates in the format
# Wkd, DD Mon YYYY HH:MM:SS GMT

dateconv(t: int): string
{
	tm : ref Tm;
	tm = daytime->gmt(t);
	return sys->sprint("%s, %.2d %s %.4d %.2d:%.2d:%.2d GMT",
		wdayname[tm.wday], tm.mday, monname[tm.mon], tm.year+1900,
		tm.hour, tm.min, tm.sec);
}

# parse a date and return the seconds since the epoch
# return 0 for a failure
#
# need to handle three formats (we'll be a bit more tolerant)
#  Sun, 06 Nov 1994 08:49:37 GMT  (rfc822+rfc1123; preferred)
#  Sunday, 06-Nov-94 08:49:37 GMT (rfc850, obsoleted by rfc1036)
#  Sun Nov  6 08:49:37 1994	  (ANSI C's asctime() format; GMT assumed)

date2sec(date : string): int
{
	tm := daytime->string2tm(date);
	if(tm == nil || tm.year < 70 || tm.zone != "GMT")
		t := 0;
	else
		t = daytime->tm2epoch(tm);
	return t;
}

now(): int
{
	return daytime->now();
}