Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!aioe.org!.POSTED!not-for-mail From: lachman@ebony.ppc.ubc.ca (Milton Lachman) Newsgroups: comp.sys.sinclair Subject: Re: Conversion of ISO Date-stamps into Weekday Numbers Date: Tue, 12 Apr 2011 18:21:01 +0000 (UTC) Organization: Pulp and Paper Centre Lines: 84 Message-ID: References: NNTP-Posting-Host: CVvRLOFGhqaX+GwAS4Somg.user.speranza.aioe.org X-Complaints-To: abuse@aioe.org X-Notice: Filtered by postfilter v. 0.8.2 Xref: x330-a1.tempe.blueboxinc.net comp.sys.sinclair:155 [This revision is optimised for speed, and extended to Byzantine and Old-Style dates.] HOW TO COMPUTE THE DAY OF THE WEEK FOR DATE-STAMPS 10010101 TO 99991231 - using Hans Lachman's Method of Congruence as generalised below - Strictly adhering to Lachman's Maxim (Complexity is a diseconomy of scale), this method is designed to run super-bly as a stand-alone subroutine when the most BASIC of computer is the only resource--meaning no values needed from user tables or system calls, and no floating point variables. Although using a processor more sophisticated than found on four-function calculators, this method is simpler to execute than Hans' original Method of Congruence needing manipulation of data by numerically competent users. It succeeds where other Methods do not when computing the day of the week even on lowly Sinclair ZX BASIC: having no need of extra instructions for data stored in tables as in Babwani's Method nor for redundant operations as in Zeller's or Tondering's--nor even a C compiler running on a bloated development system as in Mike Keith's--yet doing more in under 12 lines. Given: D$(8) as a Date-stamp YYYYMMDD in basic ISO format, N% as its offset, & F% as a false flag for non-Gregorian calendars: 300 0 Julian (historical) 301 0 Byzantine 325 0 Old-Style 300 50 Gregorian (historical) the superBASIC subroutine below is to compute: s$ as the offset Date-stamp m$(2TO 3) as the MonthIndex i% as the increment to K% g% as the Gregorian increment w% as the ISO-compatible number of the corresponding weekday: Sun=0 Mon=1 Tue=2 Wed=3 Thu=4 Fri=5 Sat=6 AUTO start,gap REM Step 0 - initialise parameters and offset D$ LET i%=F%+ F% : X%=256 : K%=19300 : s$=D$- N% SELect ON N% ON N%= 301 IF D$(5TO 6)> 8 THEN LET s$(1TO 4)=s$(1TO 4)- 1 IF s$(5TO 6)< 6 THEN LET i%=100 ON N%= 325 IF s$(5TO 8)> 9775 THEN LET i%=100 IF s$(5TO 8)> 9975 THEN LET s$(1TO 4)=s$(1TO 4)+ 1 END SELect REM Step 1 - compute the MonthIndex & Gregorian increment LET m$=X%*D$(5TO 6)+ K%+ i% : g%=F%*s$(1TO 2)DIV 8+ F% REM Step 2 - compute the weekday-number LET w%=(s$(1TO 4)DIV 4+ D$(1TO 4)+ m$(2TO 3)+ D$(7TO 8)+ g%)MOD 7 ^space The subroutine is streamlined such that the proper parameters for a calendar are to be passed: for example, a flag of 50 for Gregorian dates as of 15.oct.1582 (A.D.) & 0 for non-Gregorian as of 1.jan.1001 (A.D. for Julian & Old Style calendars; A.M. for Byzantine calendars). The subroutine thereby gives compleat, valid, historical continuity of date-stamp conversion until 31.dec.9999 for the relevant epoch. Because of its initial overlap with the historical year, the K% addend applies till December 31st. From January 1st, K%+i% applies till August 31st, the end of the Byzantine year, or March 24th, the end of the Old- Style year. Month-numbers remain defined in terms of an historical year for both (as for calendars where N%=300). -- REFERENCES http://oz.ccnet.us/dayofweek/ http://www.guernsey.net/~sgibbs/roman.html http://www.merlyn.demon.co.uk/zel-like.htm#Keith http://en.wikipedia.org/wiki/Zeller%27s_congruence http://www.tondering.dk/claus/cal/node3.html#SECTION00360000000000000000 babwani-congruence.blogspot.com/search/label/Frequently%20AskeD$20Questions