
rem date/time director library
rem by Kerry Zimmerman [71470,1340] -- October 27,1990
rem history:
rem   10/21/90 kaz factor /dt.date into /dt.mmddyy
rem   10/27/90 kaz allow handling of dates prior to 1978
rem   10/30/90 kdd minor naming and formatting adjustments
rem   10/30/90 kdd added text to getdaytext

	goto dt.skip

rem  Establish and initialize array of days per month
/dt.init:
	if dt.done = 1 then return
	dim dt.mos[12],1
	dt.mos[1]=31,28,31,30,31,30,31,31,30,31,30,31
	dt.done = 1
	return

rem  Return the current date in dt.month, dt.day and dt.year
/dt.date:
	date dt.days,dt.m,dt.tic

rem  Return dt.month, dt.day and dt.year, given dt.days
/dt.mmddyy:
	gosub dt.init
    
	dt.year = 1900
	dt.febdays = 28
    
rem add back number of days to 1978 from start of 1970
	dt.day = dt.days + 1 + 28489   
    
rem in year 1900 ?
	if dt.day < 366 then goto dt.dayconv  :rem  no
	
	dt.day = dt.day - 365
        
rem  1461 is number of days in 4 years (4 * 365 + 1)
	dt.leaps = dt.day / 1461
	dt.day  = dt.day % 1461
        
rem handle year 2100 (not a leap year) 50 leap years after 1900
	if dt.leaps > 50
		dt.day = dt.day + 1
	endif

	dt.year = dt.year + (dt.leaps * 4)
        
rem last day of year?
	if dt.day = 0
		dt.month = 12
		dt.day  = 31
		goto dt.mm2
	endif

	for dt.i = 1 to 3
		dt.year = dt.year + 1
		if (dt.day < 365) | (dt.day = 365)
			dt.i = 99 
		else
			dt.day = dt.day - 365
		endif
	next

	if dt.i # 99
		rem if get here, is a leap year
		dt.year = dt.year + 1
        
		rem but year 2100 is not a leap year
		if dt.year # 2100
			dt.febdays = 29
		endif
	endif
/dt.dayconv:
	rem convert days to month and day
	if (dt.day < 31) | (dt.day = 31)
		dt.month = 1
	else
		dt.day = dt.day - 31
		if (dt.day < dt.febdays) | (dt.day = dt.febdays)
			dt.month = 2
		else
			dt.day = dt.day - dt.febdays
			for dt.i = 3 to 12
				dt.month = dt.i
				if (dt.day < dt.mos[dt.i]) | (dt.day = dt.mos[dt.i])
					dt.i = 99
				else
					dt.day = dt.day - dt.mos[dt.i]
				endif
			next
		endif
	endif

/dt.mm2
	return    


rem Convert a date (dt.month, dt.day, dt.year) back to internal form
rem Returns answer in dt.days
rem compute number of days since  Sunday, Jan 1, 1978
/dt.indays:

	gosub dt.init
 
	if dt.year > 100 then dt.year = dt.year - 1900

	if (dt.year = 100) | ((dt.year % 4) = 0) then dt.mos[2] = 29

	dt.xyear = dt.year
	if (dt.year # 0) then dt.xyear = dt.xyear - 1

	dt.days = dt.xyear / 4

	if dt.days > 50 then dt.days = dt.days - 1

	dt.days = dt.days + (dt.year * 365) + dt.day

	if dt.month > 1
		for dt.i = 1 to dt.month - 1
			dt.days = dt.days + dt.mos[dt.i]
		next
	endif

	dt.mos[2] = 28
	dt.days = dt.days - 1 - 28489
	return

rem returns day number (0=sunday) in dt.daynum given dt.days
rem  and day of week text in dt.daytext
/dt.getdaytext:
    
    dim dt.dnames[7,10],1			:rem  create date string array
    dt.dnames$[1,1]="Sunday"
    dt.dnames$[2,1]="Monday"
    dt.dnames$[3,1]="Tuesday"
    dt.dnames$[4,1]="Wednesday"
    dt.dnames$[5,1]="Thursday"
    dt.dnames$[6,1]="Friday"
    dt.dnames$[7,1]="Saturday"
    
    dt.daynum = dt.days % 7
    if dt.daynum < 0 then dt.daynum=dt.daynum+7
    
    dim dt.daytext[10],1
    dt.daytext$=dt.dnames$[dt.daynum+1,1]
    
   	dim dt.dnames[0],0			:rem  freeup array
    return

/dt.skip:

