SMOLNET PORTAL home about changes
 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, no floating point variables and minimal
 operating system functionality beyond superBASIC as the command-line
 interpreter. 

 Although using a processor more sophisticated than found on four-function
 calculators, this method is simple to execute using Hans' original Method.
 It succeeds where other Methods do not when computing the day of the week
 on lowly 8-bit-bus systems: having no need of extra instructions for data
 stored in tables, nor for redundant operations as in Zeller's--nor a C
 compiler running on a bloated development system as in Michael Keith's--
 yet doing more in under 12 lines.

Given:

  D$(1TO 8) as a date stamp CCYYMMDD in basic ISO format,
  N%    as its Offset,
      & F%  as a false flag for non-Gregorian calendars:
  300    0    Julian (historical)
20300    0    Byzantine
  325    0    Old-Style
  300   50    Gregorian (historical);

the superBASIC subroutine below is to compute:

 s$(1TO 2) as the offset century cc
 s$(1TO 4) as the offset year ccyy
 m$(2TO 3) as the MonthIndex 
 i%    as the increment to K%
 g%    as the Gregorian adjustment
 w%    as the mod 7 day-number compatible with ISO 8601:            
       Sun=0  Mon=1  Tue=2  Wed=3  Thu=4  Fri=5  Sat=6.

AUTO start,gap

 REM Step 0 - initialises parameters
 LET i%=F%+ F% : X%=256 : K%=19300 : s$=INT((D$-N%)/100)
 SELect ON N%
        ON N%= 20300
           IF D$(5TO 6)> 8 THEN s$=s$- 100
           IF s$(5TO 6)< 6 THEN i%=100
        ON N%= 325
           IF D$(5TO 8)< 0325 THEN
               LET i%=100 : IF D$(5TO 8)> 0300 THEN s$=s$+ 100
           END IF
        ON N%= 300
           g%=s$(1TO 2)DIV 8*F%+ F%
        ON N%= REMAINDER
           PRINT "N% invalid"
 END SELect

 REM Step 1 - initiates Lachman's Congruence
 LET m$=D$(5TO 6)*X%+ K%+ i% 

 REM Step 2 - computes the day-number within the week
 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% summand
 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://terdina.net/ql/ql.html
http://merlyn.demon.co.uk/zel-like.htm#Keith
http://en.wikipedia.org/wiki/Zeller%27s_congruence
gopher://gopherite.org/0/users/retroburrowers/TemporalRetrology/68k/y4k
Response: text/plain
Original URLgopher://sdf.org/0/users/retroburrowers/TemporalRetrology/QL/F4
Content-Typetext/plain; charset=utf-8