Today I got an idea on a proram I could make that would be useful and unqic, so here it is a calculator that lets you add, subtract and multiply dates and times together. It uses Delphi’s TDateTime variable type that the integer part is the days and fraction part is time.
program timecalc; {$APPTYPE CONSOLE} {$RESOURCE TIMECALC_RES.RES} uses SysUtils, Windows, Classes; type TDateTimeOp=function(S1//First parameter for the op ,S2//second parameter for the op :string):TDatetime;//Answer for the op var systime:systemtime;//used for UTC Time exename:string; ops,//stringlist with op functions in TDateTimeOp type timeconsts//string list for the constants As PDateTime type :tstringlist; pdt:pdatetime; timefunc:TDateTimeOp; yMinutes:DWord; noresult:boolean; FUNCTION GetDateTime(s:string):tdatetime; begin if timeconsts.IndexOf(s)>-1then result:=PDateTime(timeconsts.Objects[ timeconsts.IndexOf(s)])^else if((strscan(pchar(s),DateSeparator)<>nil)and(strscan(pchar(s),TimeSeparator)<>nil))then result:=strtodatetime(s)else if strscan(pchar(s),timeseparator)<>nil then result:=strtotime( s) else if(strscan(pchar(s),DateSeparator)<>nil)then result:=strtodate(s)else if strtointdef(s,-1)<>-1 then result:=strtoint(s)*encodetime(0,1,0,0)else NoResult:=true; end; function addtime(S1,S2:string):TDateTime; begin result:=Getdatetime(s1)+GetDateTime(S2); end; function SubTime(S1,S2:string):tdatetime; begin result:=GetDateTime(s1)-GetDateTime(s2); end; function Multiply(s1,s2:String):TDatetime; begin result:=getdatetime(s1)*strtofloat(s2); end; begin exename:=extractfilename(paramstr(0)); if paramcount=0then begin writeln('Usage:',exename,' [datetimeX] [op] [datetimeY]'); writeln('Ops:'); writeln('+ Addition.'); writeln('- Subtraction.'); writeln('* Multiply([datetimeY] is a number not a date or time when this op is used)'); writeln; writeln('[datetimeX] and [datetimeY] can be date, a time or both'); writeln('If [datetimeX] or [datetimeY] have both date and time they must be surrounded with quotes "hh:mm:ss mm/dd/yyyy"'); writeln; writeln('[datetimeX] or [datetimeY] can also be one of these operators:'); writeln('NOW Current local datetime.'); writeln('UTC UTC Time.'); writeln('WEEK Length of one week'); writeln('DAY Length of one day'); writeln('MONTH Length of one month'); writeln('YEAR Length of one year'); writeln('DATE Current local date'); writeln('TIME Current local time'); writeln('%ERRORLEVEL% Use the time and date from a previous answer. Use %ERRORLEVEL% variable from the NT Command prompt'); writeln; writeln('Examples:'); writeln('Add one week from now: ',exename,' NOW + WEEK'); writeln('How much longer until 1:00pm: ',exename,' TIME - 1:00PM'); write('Press enter to quit...'); readln; exitprocess(0); end; ops:=tstringlist.Create; ops.AddObject('+',tobject(@addtime)); ops.Addobject('-',tobject(@subtime)); ops.AddObject('*',tobject(@multiply)); timeconsts:=tstringlist.Create; new(pdt); pdt^:=now; timeconsts.AddObject('NOW',tobject(pdt)); new(pdt); getsystemtime(systime); pdt^:=systemtimetodatetime(systime); timeconsts.AddObject('UTC',tobject(pdt)); new(pdt); pdt^:=7; timeconsts.AddObject('WEEK',tobject(pdt)); new(pdt); pdt^:=1; timeconsts.AddObject('DAY',tobject(pdt)); new(pdt); pdt^:=30; timeconsts.AddObject('MONTH',tobject(pdt)); new(pdt); pdt^:=365; timeconsts.AddObject('YEAR',tobject(pdt)); new(pdt); pdt^:=DATE; timeconsts.AddObject('DATE',tobject(pdt)); new(pdt); pdt^:=TIME; timeconsts.AddObject('TIME',tobject(pdt)); yminutes:=0; case ParamCount of 1:begin writeln('Need more parameters');exitprocess(0);end; 2:begin if ops.IndexOf(paramstr(2))=-1then begin writeln(paramstr(2),' is not a valid op');exitprocess(0); end else begin @timefunc:=Pointer(ops.Objects[ops.indexof(paramstr(2))]); yminutes:=trunc(timefunc(paramstr(1),'0')/encodetime(0,1,0,0)); end; end; 3:begin if ops.IndexOf(paramstr(2))=-1then begin writeln(paramstr(2),' is not a valid op');exitprocess(0); end else begin @timefunc:=Pointer(ops.Objects[ops.indexof(paramstr(2))]); yminutes:=trunc(timefunc(paramstr(1),paramstr(3))/encodetime(0,1,0,0)); end; end; else begin writeln('Too Many Parameters');exitprocess(0);end; end; if noresult then begin writeln('Bad [datetimeX] or [datetimeY] parameters'); exitprocess(0);end; writeln(datetimetostr(yminutes*encodetime(0,1,0,0))); exitprocess(yminutes); end.