WinBatch Tech Support Home

Database Search

If you can't find the information using the categories below, post a question over in our WinBatch Tech Support Forum.

TechHome

Time UDFs

Can't find the information you are looking for here? Then leave a message over on our WinBatch Tech Support Forum.

Even More Assorted TimeDate UDFs

 Keywords:  

#definefunction _DaysInMonth(adate)
	;-- input:		adate 'yyyy:mm[:dd[:hr:mi:se]]' or '' for today's date
	;-- returns:	number of days of the month

	if adate=='' then adate = TimeYmdHms()
	bdate = strCat(strSub(adate,1,7),':01:00:00:00')
	edate = strCat(strSub(TimeJulToYmd(TimeJulianDay(bdate)+31),1,7),':01:00:00:00')
	return (TimeJulianDay(edate) - TimeJulianDay(bdate))
    ;-- that's all folks
#endfunction

HR>

#definefunction _IsLastDayOfMonth(adate) ;-- input : adate 'yyyy:mm:dd[:hr:mi:se]' or '' for today's date ;-- returns: @FALSE or @TRUE if adate=='' then adate = TimeYmdHms() bdate = strCat(strSub(adate,1,10),':00:00:00') edate = strCat(strSub(TimeJulToYmd(TimeJulianDay(bdate)+31),1,7),':01:00:00:00') edate = TimeJulToYmd(TimeJulianDay(edate)-1) return bdate==edate ;-- that's all folks #endfunction

HR>

#definefunction _ChkDateTime(adate) ;-- check for valid date/time ;-- input : adate = 'yyyy:mm:dd:hr:mi:se' ;-- returns : @FALSE or @TRUE errormode(@OFF) rtv = TimeAdd( adate, '0000:00:00:00:00:01') errormode(@CANCEL) return rtv!=0 ;-- that's all folks #endfunction

HR>

#definefunction _EasterSunday(year) ;- Carl Friedrich Gauss (1777 - 1855) ;- valid period: 1900 - 2099 ;- input : yyyy[:mm:dd:hr:mi:se] ;- returns : yyyy:mm:dd yy = strSub(year,1,4) if yy<1900||yy>2099 then return 0 a = yy mod 19 b = yy mod 4 c = yy mod 7 d = (19*a + 24) mod 30 e = (2*b+4*c+6*d+5) mod 7 e1 = d+e+22 ;march mm = '03' if e1<1||e1>31 mm = '04' e1 = d+e-9 ;april if e1 == 26 then e1=19 if e1==25&&d==28&&e==6&&a>10 then e1=18 endif e1 = strFixLeft(e1,'0',2) return strCat(yy,':',mm,':',e1) ;-- that's all folks #endfunction

HR>

#definefunction _weeknumber(adate, format) ;follows the ISO8601 standard for determining week numbers. ;ISO8601 states that each week begins on a Monday, and week #1 of any year is ;the first week that contains January 4. ;That means that in some cases January 1, 2 and 3 could fall into week #52 or #53 ;of the previous year. The last few days of December could fall into week #1 of ;the following year. ;---- adate format "yyyy:mm:dd:hh:mm:ss" formats = 'yyyy:ww;ww;w' errormode(@OFF) chk = TimeJulianDay(adate) if chk==0 then adate = TimeYmdHms() errormode(@CANCEL) cwYear = ItemExtract(1,adate,":") +1 ;-- yyyy + 1 while 1 LocalJan01Jul = TimeJulianDay("%cwYear%:01:01:00:00:00") LocalDayJan01 = ((LocalJan01Jul+4) mod 7) +1 LocalOffset = LocalJan01Jul - LocalDayJan01 + int((LocalDayJan01 - 1)/4)*7 - 6 cwWeek = int((TimeJulianDay(adate) - LocalOffset)/7) if cwWeek > 0 then break cwYear = cwYear - 1 endwhile indx = ItemLocate(format, formats, ';') select indx case 0 WeekNumber = strCat(cwYear,':',StrFixLeft(cwWeek, "0", 2)) break case 1 WeekNumber = strCat(cwYear,':',StrFixLeft(cwWeek, "0", 2)) break case 2 WeekNumber = StrFixLeft(cwWeek, "0", 2) break case 3 WeekNumber = cwWeek break endselect return WeekNumber ;-- that's all folks #endfunction

HR>

#definefunction _datefmt(adate, format) ;Uses: _WeekNumber ;In: adate = 'yyyy:mm:dd:hr:mi:se' ; format = example: "Hello WinBatch friends, today it is dddd, d MMMM yyyy hh:mm:ss tt, day D of yyyy, week ww" ;Return: formatted date ;--- explanation of fmtelements see select statement.... fmtelements = 'hh;h;HH;H;mm;m;ss;s;tt;t;dddd;ddd;dd;d;MMMM;MMM;MM;M;yyyy;yy;ww;w;DDD;D' separatorchars = ` :,'"/-_` ;dutch ;listddd = 'ma;di;wo;do;vr;za;zo' ;listdddd = 'maandag;dinsdag;woensdag;donderdag;vrijdag;zaterdag;zondag' ;listMMM = 'jan;feb;mrt;apr;mei;jun;jul;aug;sep;oct;nov;dec' ;listMMMM = 'januari;februari;maart;april;mei;juni;juli;augustus;september;october;november;december' ;english listddd = 'mon;tue;wed;thu;fri;sat;sun' listdddd = 'monday;tuesday;wednesday;thursday;friday;saturday;sunday' listMMM = 'jan;feb;mar;apr;may;jun;jul;aug;sep;oct;nov;dec' listMMMM = 'januari;februari;march;april;may;june;july;august;september;october;november;december' ptr = 0 fmt_tmp = strClean(format, separatorchars,';', @TRUE, 1) for i=1 to ItemCount(fmt_tmp,';') thiselem = ItemExtract(i,fmt_tmp,';') if thiselem<>'' ptr = strIndex(format, thiselem, ptr+1, @FWDSCAN) indx = ItemLocate(thiselem,fmtelements,';') select indx case 0 elem = thiselem break case 1 ;hh = Hour(01-12) elem = StrFixLeft((strSub(adate,12,2) mod 12),'0',2) break case 2 ;h = Hour( 1-12) elem = Int(strSub(adate,12,2) mod 12) break case 3 ;HH = Hour(01-23) elem = strSub(adate,12,2) break case 4 ;H = Hour( 1-23) elem = Int(strSub(adate,12,2)) break case 5 ;mm = Minute(00-59) elem = StrFixLeft(strSub(adate,15,2),'0',2) break case 6 ;m = Minute(0-59) elem = Int(strSub(adate,15,2)) break case 7 ;ss = Second(00-59) elem = StrFixLeft(strSub(adate,18,2),'0',2) break case 8 ;s = Second( 0-59) elem = Int(strSub(adate,18,2)) break case 9 ;tt = AM/PM elem = 'AM' hh = Int(strSub(adate,12,2)) if hh > 12 then elem = 'PM' break case 10 ;t = A/P elem = 'A' hh = Int(strSub(adate,12,2)) if hh > 12 then elem = 'P' break case 11 ;dddd = Day Name(full) elem = ItemExtract((TimeJulianDay(adate)+4) mod 7 +1,listdddd,';') break case 12 ;ddd = Day Name(abbr.) elem = ItemExtract((TimeJulianDay(adate)+4) mod 7 +1,listddd,';') break case 13 ;dd = Day (2 digits) elem = strFixLeft(strSub(adate,9,2),'0',2) break case 14 ;d = Day elem = Int(strSub(adate,9,2)) break case 15 ;MMMM = Month Name(full) elem = ItemExtract(strSub(adate,6,2),listMMMM,';') break case 16 ;MMM = Month Name(abbr.) elem = ItemExtract(strSub(adate,6,2),listMMM,';') break case 17 ;MM = Month (2 digits) elem = StrFixLeft(strSub(adate,6,2),'0',2) break case 18 ;M = Month elem = Int(strSub(adate,6,2)) break case 19 ;yyyy = Year (4 digits) elem = strSub(adate,1,4) break case 20 ;yy = Year (2 digits) elem = strSub(adate,3,2) break case 21 ;ww = Week Number (2 digits) elem = _weeknumber(adate, 'ww') break case 22 ;w = Week Number elem = _weeknumber(adate, 'w') break case 23 ;DDD = Day of Year ( 3 digits) date01 = strCat(strSub(adate,1,4),':01:01') elem = StrFixLeft(TimeJulianDay(adate) - TimeJulianDay(date01) + 1,'0',3) break case 24 ;D = Day of Year date01 = strCat(strSub(adate,1,4),':01:01') elem = TimeJulianDay(adate) - TimeJulianDay(date01) + 1 break endselect format = strCat(strSub(format,1,ptr-1),elem,strSub(format,ptr+strLen(thiselem),-1)) ptr = ptr + strLen(elem) endif next i return format ;-- that's all folks #endfunction

HR>

#DefineFunction udfGetSundayOfWeek (YmdHms) ; Returns datetime string. Leaves Hms untouched. Return (TimeSubtract(YmdHms,StrCat("0:0:",(TimeJulianDay(YmdHms)+5) mod 7))) #EndFunction

HR>

Message("Previous Sunday was", udfGetSundayOfWeek (TimeYmdHms())) Message('EasterSunday',_eastersunday('2001:02:28:23:44:01')) Message('format =', _datefmt(TimeYmdHms(), "Hello WinBatch friends, today it is dddd, d MMMM yyyy hh:mm:ss tt, day D of yyyy, week ww"))



Article ID:   W15014
File Created: 2004:04:08:12:21:44
Last Updated: 2004:04:08:12:21:44