> DateTest  Test BLib.Time functions : (: 21 MODE&87:PRINTSPC5"Test Time&Date Routines"' <+ ctrl% 30,data% 127:X%=ctrl%:Y%=X%256 F 26,12 P: Z& : <>17 " at line ";: d :*FX3 n"1: OrdToTime test" x"2: TimeToOrd test" "3: TimeToOrd year test" "4: TimeToOrd month test" '"0: Exit" A$=:"01234",A$) A$="1":_OrdToTime_Test A$="2":_TimeToOrd_Test A$="3":_TimeToOrd_Year A$="4":_TimeToOrd_Month A$="0"  : _OrdToTime_Test 4mem1%=data%:mem2%=data%+64: Allow for overflows year%=1900:month%=1:date%=1 hour%=0:minute%=0:second%=0 /"Date Date_FromOrd swiOrdToTime" " ,6d0(date%,2)"/"d0(month%,2)"/"d0(year%,4)": "; 6F:::Date_FromOrd(mem1%,date%,month%,year%,hour%,minute%,second%,0) @)"&"h0(mem1%!1,8)h0(mem1%?0,2)" "; JCswiOrdToTime(mem2%,date%,month%,year%,hour%,minute%,second%,0) T)"&"h0(mem2%!1,8)h0(mem2%?0,2)" "; ^A mem1%?0<>mem2%?0 mem1%!1<>mem2%!1 "**ERROR**";:A%=(100) h:year%=year%+1 ryear%>2047: | : (_TimeToOrd_Test:'"TimeToOrd test"  off%=3 &mem%=data%:mem%!0=&890000:mem%?4=0 @"TIME Date_ToOrd swiTimeToOrd":*FX3,16 _TimeToOrd_Display():13  _TimeToOrd_Display() Zerror%=(hour%<>hour0%)(minute%<>minute0%)(second%<>second0%)(centi%<>centisecond0%) Aerror%=error%(day%<>day0%)(month%<>month0%)(year%<>year0%) ?error%:"FX3":_TimeToOrd_Display():" **ERROR**":*FX3,16 R mem%!0=mem%!0+1:IFmem%!0=0:mem%?4=mem%?4+1:PROC_TimeToOrd_Display(TRUE):V.13 Amem%!off%=mem%!off%+1:mem%?off%=0:_TimeToOrd_Display():13 mem%!0=0 mem%?4=0::*FX3  : &"_TimeToOrd_Display(display%) 0 5-byte TIME :1display%:"&"h0(mem%!1,8)h0(mem%?0,2)" "; D: N Manual time conversion XDate_ToOrd(mem%) b=display%:d0(day%,2)"/"d0(month%,2)"/"d0(year%,4)" "; lSdisplay%:d0(hour%,2)":"d0(minute%,2)":"d0(second%,2)"."d0(centi%,2);" "; v*day0%=day%:month0%=month%:year0%=year% Ghour0%=hour%:minute0%=minute%:second0%=second%:centisecond0%=centi% : ! RISC OS SWI time conversion swiTimeToOrd(mem%) =display%:d0(day%,2)"/"d0(month%,2)"/"d0(year%,4)" "; Sdisplay%:d0(hour%,2)":"d0(minute%,2)":"d0(second%,2)"."d0(centi%,2);" ";  : : _TimeToOrd_Year  mem%=data%:mem%?0=0:mem%!1=0 year%=1900:month%=1:date%=1 hour%=0:minute%=0:second%=0 8"TIME Date_ToOrd swiTimeToOrd"   '"&"h0(mem%!1,8)h0(mem%?0,2)" ";  :::Date_ToOrd(mem%) *4d0(date%,2)"/"d0(month%,2)"/"d0(year%,4)" "; 4Id0(hour%,2)":"d0(minute%,2)":"d0(second%,2)"."d0(centi%,2);" "; >+day0%=date%:month0%=month%:year0%=year% HGhour0%=hour%:minute0%=minute%:second0%=second%:centisecond0%=centi% RswiTimeToOrd(mem%) \4d0(date%,2)"/"d0(month%,2)"/"d0(year%,4)" "; fId0(hour%,2)":"d0(minute%,2)":"d0(second%,2)"."d0(centi%,2);" "; pZerror%=(hour%<>hour0%)(minute%<>minute0%)(second%<>second0%)(centi%<>centisecond0%) zBerror%=error%(date%<>day0%)(month%<>month0%)(year%<>year0%) 'error%:"**ERROR**":A%=(10) 13 >leap%=(year% 400)=0 ((year% 4)=0 (year% 100)<>0) 4mem%!1=mem%!1+&BBF81E:leap%:mem%!1=mem%!1+&83D6 mem%?4>&7F:  : _TimeToOrd_Month  mem%=data%:mem%?0=0:mem%!1=0 year%=1900:month%=1:date%=1 hour%=0:minute%=0:second%=0 8"TIME Date_ToOrd swiTimeToOrd"  '"&"h0(mem%!1,8)h0(mem%?0,2)" "; :::Date_ToOrd(mem%) 4d0(date%,2)"/"d0(month%,2)"/"d0(year%,4)" "; Id0(hour%,2)":"d0(minute%,2)":"d0(second%,2)"."d0(centi%,2);" "; $+day0%=date%:month0%=month%:year0%=year% .Ghour0%=hour%:minute0%=minute%:second0%=second%:centisecond0%=centi% 8swiTimeToOrd(mem%) B4d0(date%,2)"/"d0(month%,2)"/"d0(year%,4)" "; LId0(hour%,2)":"d0(minute%,2)":"d0(second%,2)"."d0(centi%,2);" "; VZerror%=(hour%<>hour0%)(minute%<>minute0%)(second%<>second0%)(centi%<>centisecond0%) `Berror%=error%(date%<>day0%)(month%<>month0%)(year%<>year0%) j'error%:"**ERROR**":A%=(10) 13 t>leap%=(year% 400)=0 ((year% 4)=0 (year% 100)<>0) ~4days%="312831303130313130313031",month%*2-1,2) month%=2:leap%:days%=29 mem%!1=mem%!1+days%*&83D6 0  : :  Bdata%!0=0:data%!4=0:data%!8=0:data%!12=0:data%!16=0:data%!20=0 posn%=0::0,0)' 4;d0(data%?0,2)":"d0(data%?1,2)":"d0(data%?2,2)"."d0(data%?3,2)" "d0(data%?4,2)"/"d0(data%?5,2)"/"d0(data%!6,4) *4"&"h0(data%?14,2);h0(data%!10,8)' ,posn%<7:4+(posn%7)*3-3*(posn%>3),2); !posn%>7:17-(posn%7)*2,3);  -A$=:";-+= 0123456789ABCDEFabcdef",A$) Wposn%=6:"-=+;",A$):data%!posn%=data%!posn%+(A$="-"A$="=")-(A$="+"A$=";"):A$="" ,A$=";"A$="+":data%?posn%=data%?posn%+1 (,A$="-"A$="=":data%?posn%=data%?posn%-1 2Kposn%<6:A%="0123456789",A$):A%:data%?posn%=(data%?posn%*10+A%-1)100 9:A%="0123456789ABCDEF",A$):A%:data%?posn%=data%?posn%*16+A%-1 P+A$=" ":posn%=posn%+1:posn%>14:posn%=0 Zposn%=7:posn%=10 d\posn%<7:Date_FromOrd(data%+10,data%?4,data%?5,data%!6,data%?0,data%?1,data%?2,data%?3) nposn%>7:Date_ToOrd(data%+10):data%?0=hour%:data%?1=minute%:data%?2=second%:data%?3=centi%:data%?4=date%:data%?5=month%:data%!6=year% x0 : : : :  : : . SWI versions of time conversion routines . ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ : 1swiOrdToTime(mem%,d%,m%,y%,hr%,mn%,sc%,cs%)  A% )A%=mem%+16:A%!0=cs%:A%!4=sc%:A%!8=mn% (A%!12=hr%:A%!16=d%:A%!20=m%:A%!24=y% 3ș "Territory_ConvertOrdinalsToTime",-1,mem%,A%  ": ,swiTimeToOrd(mem%): A$ 6Pș "OS_ConvertDateAndTime",mem%,255,0),255,"%CE%YR%MN%DY%24%MI%SE%CS" A$ @5year%= A$,4):month%= A$,5,2):date%= A$,7,2) J BLib.Time 1.02 17-Sep-2005 5 RTC Time and date functions, includes BLib.Date : (C)J.G.Harston, may be freely used and redistributed : ---------------------------------------------------- / All functions assume global control block 0 pointed to by X%,Y% and set up as follows: 1 DIM ctrl% 31,data% 79:X%=ctrl%:Y%=X%DIV256 : : ' Real-Time-Clock reading functions &' ================================= 0: :H ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ DG FNtime - read RTC time&date or null string if none present NL returned date is correct for years after 1996 and 1999 X: b(ݤtime:?X%=0:A%=14:&FFF1:?X%=0:="" lX%?25=13:X%?15=13:A%=$X%,5,2)32:$(X%+11)=($(X%+11)+16*A%-100*($(X%+11)<1981)):A%:X%?6=13:$(X%+4)="0"+($(X%+4)-32),2):X%?6=32 vX%?15=46:=$X% : H ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C FNTime - Return time&date or null string if none found A On-board RTC and fileserver RTC are checked 0 and day of week calculated : 6ݤTime:!X%=1:A%=14:&FFF1:A%=07:X%?A%=~X%?A%: >time:year%=0:month%=0:day%=0:hour%=0:minute%=0:second%=0 HA%=14:!X%=1:&FFF1:!X%=1: RA%=07:X%?A%=~X%?A%: \ BLib.Date 1.02 17-Sep-2005 % Time and date support functions 9 (C)J.G.Harston, may be freely used and reditributed 9 --------------------------------------------------- : : H ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $6 FNDay(day%) - return 3-char day of week string .0 FNMon(month%) - return 3-char month string 8: B4ݤDay(A%):="000SunMonTueWedThuFriSat",A%*3+1,3) LLݤMon(A%):="000JanFebMarAprMayJunJulAugSepOctNovDecDDDEEEFFF",A%*3+1,3) V: `H ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ j) FNDate_DayOfWeek(day%,month%,year%) t: - return day of week for supplied date ~* 1=Sunday, 7=Saturday : (ݤDate_DayOfWeek(d%,m%,y%):y%=y%400 q=(y%*365.25+m%*30+d%+"120112234455",m%,1)+((y%4)=0)-((y%-1)100)-(m%>2((y%4)=0(y%100)<>0y%=0))+3)7+1 : H ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ K PROCDate_FromOrd - convert time and date to 5-byte centi-second count * On entry: mem%->five bytes of memory , day, month, year of the date A hours, minutes, seconds, centiseconds of the time I On exit: mem% to mem%+4 containes five-byte centisecond time since ' 00:00:00 on 1-Jan-1900. : ;Date_FromOrd(mem%,d%,m%,y%,hr%,mn%,sc%,cs%):y%=y%400 qd%=y%*365.25+m%*30+d%+"120112234455",m%,1)+((y%4)=0)-((y%-1)100)-(m%>2((y%4)=0(y%100)<>0y%=0))+36493 d%>146066:d%=d%-146097 =d%=d%*&41EB:mem%!1=d%+d%:d%=((hr%*60+mn%)*60+sc%)*100+cs% (#?mem%=d%:mem%!1=mem%!1+d%256: 2: five bytes of memory containing five-byte centisecond Z2 time since 00:00:00 on 1-Jan-1900. d, On exit: day, month, year of the date nA hours, minutes, seconds, centiseconds of the time x: $Date_ToOrd(mem%): A%,B%,C%,D% @year%=0:month%=0:day%=0:hour%=0:minute%=0:second%=0:centi%=0 -mem%!1<0:: Problems with negatives ATM FD%=mem%!1&83D6+2447065:C%=mem%?0+256*(mem%!1&83D6):centi%=C%100 >C%=C%100:second%=C%60:C%=C%60:minute%=C%60:hour%=C%60 8B%=((D%*4+3)146097-4)+3:C%=B%14614*5+2:D%=D%*4+3 .A%=C%153+2:day%=C%1535+1:month%=A%12+1 *year%=D%146097*100+B%1461+A%12-4800  : H ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > FNDate_Since - return number of days since a past date I On entry: td%, tm% and ty% should be set to today's date, month and I year and pd%, pm% and py% should be set to the past date,  month and year. ( Requires X%->5-byte control block ": ,1ݤDate_Since(td%,tm%,ty%,pd%,pm%,py%): past% 64Date_FromOrd(X%,pd%,pm%,py%,0,0,0,0):past%=X%!1 @=Date_FromOrd(X%,td%,tm%,ty%,0,0,0,0):=(X%!1-past%)&83D6 J: T$ݤd0(A%,N%)="000000000"+A%,N%)