1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-15 04:16:21 +00:00

Support for time zones and non-US DST

Use bits in .RYEAR/.RLPDTM result to return a local time zone,
TZONE (definable in SYSTEM;CONFIG).
TZONE should be the integer timezone offset (hours West of UTC)
	Bit 4.4      => timezone known (otherwise, assume EST/EDT = 5)
	Bit 4.3      => sign bit of timezone offset
	Bits 3.5-3.1 => absolute value of timezone offset

If DSTEU is defined and != 0, calculate daylight savings time
according to European Union rules:
- starts at 2:00 (standard time) on the last Sunday in March,
- ends at 2:00 (standard time) on the last Sunday in October.
This commit is contained in:
Björn Victor
2021-06-22 13:34:53 +02:00
committed by Lars Brinkhoff
parent 978d362813
commit a65a038146
5 changed files with 169 additions and 16 deletions

View File

@@ -196,6 +196,19 @@ GLPDTM: CONO PI,CLKOFF ;AVOID DOUBLE YEAR INCREMENT
PUSH P,A ;SAVE # SECONDS DURING NEXT CALL
PUSHJ P,GDWOBY ;GET DAY OF WEEK OF BEGINNING OF YEAR (0 => SUNDAY)
DPB B,[270300,,E] ;DEPOSIT IN RIGHT PLACE
IFDEF TZONE,[
;;[BV] timezone hack:
;; 4.4 => Timezone known
;; 4.3 => sign bit of timezone offset from UTC (hours West of UTC)
;; 3.5-3.1 => absolute value of timezone offset from UTC (fixnum)
TLO E,10000 ;Set TZ known bit (4.4)
IFL TZONE,[ ;; negative offset
TLO E,4000 ;Set TZ sign bit (4.3)
MOVEI A,-TZONE
]
.ELSE MOVEI A,TZONE
DPB A,[230400,,E] ;3.5-3.1 is ABS(TZONE)
]
POP P,A ;RESTORE A
AOS (P) ;CAUSE RETURN TO SKIP
@@ -204,12 +217,24 @@ GLPDTM: CONO PI,CLKOFF ;AVOID DOUBLE YEAR INCREMENT
GLPDT2: JFCL ;POPJ FOR STD TIME
;JRST CRDDST FOR DAY LIGHT TIME
;JFCL "NORMAL"
IFDEF DSTEU,IFN DSTEU,[
;; [BV] hack DST for EU rules
CAML A,[<MAR <31.-6>>*SPD+7200.] ;If before 2am last Sunday in March,
CAML A,[<OCT 31.>*SPD+7200.] ;or after 2am Oct 31 (standard time!),
POPJ P, ;then obviously standard time
CAML A,[<MAR 31.>*SPD+7200.] ;If before 2am March 31,
CAML A,[<OCT <31.-6>>*SPD+7200.] ;or after 2am possbly last Sunday in October,
JRST GLPDT3 ;then we have to compute
;; else it's obviously DST
]
.ELSE [
CAML A,[<APR 1>*SPD+7200.] ;IF BEFORE 2AM APR 1,
CAML A,[<OCT 31.>*SPD+3600.] ;OR IF AFTER 1AM STANDARD TIME OCT 31,
POPJ P, ;THEN OBVIOUSLY STANDARD TIME IS IN EFFECT
CAML A,[<APR 7>*SPD+7200.] ;IF BEFORE 2AM APR 7 STANDARD TIME,
CAML A,[<OCT 25.>*SPD+3600.] ;OR IF AFTER 1AM STANDARD TIME OCTOBER 25,
JRST GLPDT3 ;THEN NOT OBVIOUS
]
CRDDST: TLO E,100000 ;DAYLIGHT SAVINGS TIME, SET BIT IN E
ADDI A,3600. ;CONTINUE TO LOCALIZE THE TIME THAT WILL BE RETURNED
POPJ P,
@@ -238,12 +263,20 @@ GLPDT3: PUSH P,A ;SAVE # SECS
POP P,A ;DAYLIGHT SAVINGS TIME, RESTORE A
JRST CRDDST ;MUNG A AND E AND RETURN
IFDEF DSTEU,IFN DSTEU,[
CRDSB: 7200. ;In Mar changes at 2AM (standard time)
7200. ;In October also changes at 2AM (standard time!)
CRDTST: CAIGE A,<MAR <31.-6>> ;First possible last Sunday in March
CAIL A,<OCT <31.-6>> ;First possible last Sunday in October
]
.ELSE [
CRDSB: 7200. ;IN APR CHANGES AT 2AM EST
3600. ;IN OCTOBER CHANGES AT 1AM EST
CRDTST: CAIGE A,<APR 1>
CAIL A,<OCT 25.>
]
;IF LEAP YEAR THEN SET BIT 4.8 OF E
;IF NOT LEAP YEAR THEN IF AFTER FEB 28 THEN SET BIT 4.9 OF E AND ADD SPD TO A