[futurebasic] Time, Zones & Daylight Saving

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : August 1999 : Group Archive : Group : All Groups

From: "Chris Wyatt." <space@...>
Date: Fri, 27 Aug 1999 18:04:03 +1000
G'day All,

Ken asked me to put up my version of his program when I got it going. It
assumes the world is divided into 24 time zones, so leaves out the 1/6
of the world in odd time zones. But you should be able to tell if you
are going to wake somone up if you ring across many time zones. Also you
will have to get Ken's PICT of time zones for the second window (just un
REM the appropriate spots). Well here it is:

'---------------------- Begin -------------------------


'un Rem the next line if you have Ken's PICT
'RESOURCES "timeZone.rsrc"
COMPILE 0, _caseInsensitive_IncludeCDEF

'---------------------- Globals -------------------------
DIM gProgramEnds,gZone%,gSelZoneDS%

DIM RECORD AstroInfo
  DIM LocLat!
  DIM LocLaD%
  DIM LocLaM%
  DIM LocLaS%
  DIM LocLng!
  DIM LocLnD%
  DIM LocLnM%
  DIM LocLnS%
  DIM LocDst%
  DIM LocDif!
DIM END RECORD _AstroInfoRecSize

END GLOBALS

'---------------------- Constants -----------------------

_machineLocation = 12

'---------------------- Functions -----------------------
CLEAR LOCAL
DIM rect.8

LOCAL FN mainBuild

  WINDOW # -1,"Universal Time Adjuster",( 5, 42)-( 620, 445),_docNoGrow

  APPLE MENU "(Time Adjuster Demo"

  MENU 1,0,_enable,"File"
  MENU 1,1,_enable,"Quit/Q"

  EDIT MENU 2

  MENU 3,0,_enable,"Map"
  MENU 3,1,_enable,"Show Time Zone Map"
  MENU 3,2,_disable,"Hide Time Zone Map"

  TEXT _geneva, 12

  EDIT FIELD  1,"Current GMT",( 20, 75)-( 158, 95),_statNoFramed,
_centerJust
  EDIT FIELD  2,"",( 20, 95)-( 158, 112),_statFramed, _centerJust

  EDIT FIELD  3,"Current System Time",( 220, 75)-( 368,
95),_statNoFramed, _centerJust
  EDIT FIELD  4,"",( 220, 95)-( 368, 112),_statFramed, _centerJust

  EDIT FIELD  5,"Current Selected Zone Time",( 420, 59)-( 557,
95),_statNoFramed, _centerJust
  EDIT FIELD  6,"",( 420, 95)-( 557, 112),_statFramed, _centerJust

  EDIT FIELD  7,"",( 220, 120)-( 358, 140),_statNoFramed, _centerJust

  TEXT _times,30
  COLOR _zRed
  EDIT FIELD  8,"Universal Time Adjuster",( 0, 19)-( 620,
49),_statNoFramed, _centerJust

  TEXT _geneva, 9
  COLOR _zBlack

  BUTTON  1, 1,"+12 International Date Line East",( 20, 168)-( 200,
188),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  2, 1,"+11 X-Ray (Military)",( 20, 189)-( 200,
209),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  3, 1,"+10 GST (Guam), AEST, Russia 9",( 20, 209)-( 200,
229),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  4, 1,"+9 JST (Japan), Russia 8",( 20, 231)-( 200,
251),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  5, 1,"+8 CTT (China Coast), WAST",( 20, 251)-( 200,
271),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  6, 1,"+7 Russia 6",( 20, 271)-( 200,
291),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  7, 1,"+6 ZP6-Chesapeake Bay, Russia 5",( 20, 293)-( 200,
313),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  8, 1,"+5 ZP5-Chesapeake Bay, Russia 4",( 20, 313)-( 200,
333),_radio_CDEFbaseID_CDEFuseWindowFont

  BUTTON  9, 1,"+4 ZP4-Russia Zone 3",( 220, 146)-( 400,
166),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  10, 1,"+3 BT (Baghdad Time), Russia 2",( 220, 167)-( 400,
187),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  11, 1,"+2 EET (Eastern European Time)",( 220, 187)-( 400,
207),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  12, 1,"+1 CET (Central European Time)",( 220, 209)-( 400,
229),_radio_CDEFbaseID_CDEFuseWindowFont

  BUTTON  13, 2,"0 - GMT, UT or Zulu Time",( 220, 241)-( 400,
261),_radio

  BUTTON  14, 1,"-1 WAT (West Africa Time)",( 220, 272)-( 400,
292),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  15, 1,"-2 AT (Azores Time)",( 220, 294)-( 400,
314),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  16, 1,"-3 Charlie Time (Brazil)",( 220, 314)-( 400,
334),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  17, 1,"-4 AST (Atlantic Standard Time)",( 220, 334)-( 400,
354),_radio_CDEFbaseID_CDEFuseWindowFont

  BUTTON  18, 1,"-5 EST (Eastern Standard Time)",( 420, 168)-( 690,
188),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  19, 1,"-6 CST (Central Standard Time)",( 420, 188)-( 690,
208),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  20, 1,"-7 MST (Mountain Standard Time)",( 420, 210)-( 690,
230),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  21, 1,"-8 PST (Pacific Standard Time)",( 420, 230)-( 690,
250),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  22, 1,"-9 YST (Yukon Standard Time)",( 420, 250)-( 690,
270),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  23, 1,"-10 AHST (Alaska-Hawaii Standard)",( 420, 272)-( 690,
292),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  24, 1,"-11 NT (Nome) & ST (Samoa)",( 420, 292)-( 690,
312),_radio_CDEFbaseID_CDEFuseWindowFont
  BUTTON  25, 1,"-12 International Date Line West",( 420, 312)-( 690,
332),_radio_CDEFbaseID_CDEFuseWindowFont

  BUTTON  26, 1,"Quit",(525,365)-(583,385),_shadow

  BUTTON  27, 1,"Checked box means this Mac is running on Daylight
Savings Time.",
(20,370)-(370,390),_checkBox_CDEFbaseID_CDEFuseWindowFont

  BUTTON  28,1,"Click if Daylight savings in selected zone.",( 395,
120)-( 625, 140),_radio_CDEFbaseID_CDEFuseWindowFont

  WINDOW  1
END FN


LOCAL FN showMap

  WINDOW #2,"World Time Zones",( 0, 0)-( 640, 410),_docNoGrow
'un Rem the next line if you have Ken's PICT
  'PICTURE FIELD #1, %128%, ( 0, 0)-( 640, 410),
_statNoFramed,_scaledPict
  WINDOW #2

END FN

LOCAL FN setTime$(t$)

  LONG IF (VAL(LEFT$(t$,2)) => 12) AND (VAL(LEFT$(t$,2)) < 24)
    t$ = STR$(VAL(LEFT$(t$,2))-12) + RIGHT$(t$,6) + " PM"
    LONG IF (VAL(LEFT$(t$,2)) = 0) OR (VAL(LEFT$(t$,2)) = 24)
      t$ =" 12" + RIGHT$(t$,9)
    END IF
  END IF

  LONG IF RIGHT$(t$,2) <> "PM"
    t$ = t$ + " AM"
    LONG IF VAL(LEFT$(t$,2)) = 0
      t$ = " 12" + RIGHT$(t$,9)
    END IF
  END IF

  LONG IF (VAL(LEFT$(t$,3)) = 12) AND (RIGHT$(t$,2) = "PM")
    LONG IF (VAL(MID$(t$,5,2)) < 1) AND (VAL(MID$(t$,8,2)) < 1)
      t$ = LEFT$(t$,10) + "Noon"
    END IF
  END IF

  LONG IF (VAL(LEFT$(t$,3)) = 12) AND (RIGHT$(t$,2) = "AM")
    LONG IF (VAL(MID$(t$,5,2)) < 1) AND (VAL(MID$(t$,8,2)) < 1)
      t$ = LEFT$(t$,10) + "Midnight"
    END IF
  END IF

END FN = t$

LOCAL FN doTimer

  t$=TIME$
  t$=LEFT$(t$,8)
  ut$ = t$                                        'universal/UT/GMT/zulu
time
  zt$ = t$                                        'time in zone selected


  ut$ = LEFT$(ut$,2)
  ut% = VAL(ut$)
  ut% = ut% - AstroInfo.LocDif!
  IF AstroInfo.LocDst% THEN ut% = ut% - 1
  IF ut% > 24 THEN ut% = ut% - 24
  IF ut% < 0 THEN ut% = ut% + 24
  ut$ = MID$(t$,3,6)
  ut$ = STR$(ut%) + ut$
  ut$ = RIGHT$(ut$,8)

  zt$ = LEFT$(zt$,2)
  zt% = VAL(zt$)
  zt% = zt% - AstroInfo.LocDif!
  IF AstroInfo.LocDst% THEN zt% = zt% - 1
  zt% = zt% + gZone%
  IF gSelZoneDS% THEN zt% = zt% + 1
  IF zt% > 24 THEN zt% = zt% - 24
  IF zt% < 0 THEN zt% = zt% + 24
  zt$ = MID$(t$,3,6)
  zt$ = STR$(zt%) + zt$
  zt$ = RIGHT$(zt$,8)

  ut$ = FN setTime$(ut$)
  t$ = FN setTime$(t$)
  zt$ = FN setTime$(zt$)
  z$ = STR$(AstroInfo.LocDif!) + " is your Zone."

  EDIT$(2) = ut$
  EDIT$(4) = t$
  EDIT$(6) = zt$
  EDIT$(7) = z$

END FN

LOCAL FN ReadLocation(locRecAddr&)
  `     MOVE.L  ^locRecAddr&,A0
  `     MOVE.L  #$000C00E4,D0
  `     DC.W    $A051
END FN

LOCAL FN
StoreLocation(LocationLat!,LocationLng!,LocationDst%,LocationDif!)
  DIM DateTimeRec.DateTimeRecSize


  Seconds&=3600*ABS(FRAC(LocationLat!))
  CALL SECS2DATE(Seconds&,@DateTimeRec)
  LocationLaD%=INT(LocationLat!)
  LocationLaM%=DateTimeRec.Minute%
  LocationLaS%=DateTimeRec.Second%


  Seconds&=3600*ABS(FRAC(LocationLng!))
  CALL SECS2DATE(Seconds&,@DateTimeRec)
  LocationLnD%=INT(LocationLng!)
  LocationLnM%=DateTimeRec.Minute%
  LocationLnS%=DateTimeRec.Second%


  AstroInfo.LocLat!=LocationLat!
  AstroInfo.LocLaD%=LocationLaD%
  AstroInfo.LocLaM%=LocationLaM%
  AstroInfo.LocLaS%=LocationLaS%
  AstroInfo.LocLng!=LocationLng!
  AstroInfo.LocLnD%=LocationLnD%
  AstroInfo.LocLnM%=LocationLnM%
  AstroInfo.LocLnS%=LocationLnS%
  AstroInfo.LocDst%=LocationDst%
  AstroInfo.LocDif!=LocationDif!
END FN

LOCAL FN GetLocation                              'Uses settings of Map
control panel

  DIM Location.machineLocation
  FN ReadLocation(@Location)
  LocationLat! = 360.0 * Location.latitude& / (2^32)
  LocationLng! = 360.0 * Location.longitude& / (2^32)
  LocationDst% = PEEK(@Location + _DlsDelta)
  IF LocationDst%=128 THEN LocationDst%=-1
  LocationGMT& = Location.DlsDelta& AND &00FFFFFF
  IF LocationGMT& AND &00800000 THEN LocationGMT& = LocationGMT& OR
&FF000000
  LocationDif! = LocationGMT&/3600

  FN StoreLocation(LocationLat!,LocationLng!,LocationDst%,LocationDif!)

  dstCheck% = AstroInfo.LocDst%                   'AstroInfo.LocDst%
equals Summertime Hrs +/- from Present Time

  LONG IF dstCheck% = -1
    BUTTON  27, _markedBtn
  XELSE
    BUTTON 27, 1
  END IF

END FN

LOCAL FN radioGroup (btnClicked, first, last)
  FOR btnNum = first TO last
    LONG IF BUTTON(btnNum) = _markedBtn
      BUTTON #btnNum, _activeBtn
    END IF
  NEXT btnNum
  BUTTON #btnClicked, _markedBtn
END FN

LOCAL FN doDialog
  evnt = DIALOG(0)
  id = DIALOG(evnt)

  SELECT evnt

    CASE _wndClick
      LONG IF WINDOW(1)
        WINDOW #1
      XELSE
        WINDOW #2
      END IF

    CASE _wndClose
      SELECT id
        CASE (1)
          WINDOW CLOSE #1
          gProgramEnds = true
        CASE (2)
          WINDOW CLOSE #2
          MENU 3,1, _enable
          MENU 3,2, _disable
      END SELECT

    CASE _btnClick
      SELECT id
        CASE(1)
          FN radioGroup(1, 1, 25)
          gZone% = 12
        CASE(2)
          FN radioGroup(2, 1, 25)
          gZone% = 11
        CASE(3)
          FN radioGroup(3, 1, 25)
          gZone% = 10
        CASE(4)
          FN radioGroup(4, 1, 25)
          gZone% = 9
        CASE(5)
          FN radioGroup(5, 1, 25)
          gZone% = 8
        CASE(6)
          FN radioGroup(6, 1, 25)
          gZone% = 7
        CASE(7)
          FN radioGroup(7, 1, 25)
          gZone% = 6
        CASE(8)
          FN radioGroup(8, 1, 25)
          gZone% = 5
        CASE(9)
          FN radioGroup(9, 1, 25)
          gZone% = 4
        CASE(10)
          FN radioGroup(10, 1, 25)
          gZone% = 3
        CASE(11)
          FN radioGroup(11, 1, 25)
          gZone% = 2
        CASE(12)
          FN radioGroup(12, 1, 25)
          gZone% = 1
        CASE(13)
          FN radioGroup(13, 1, 25)
          gZone% = 0
        CASE(14)
          FN radioGroup(14, 1, 25)
          gZone% = -1
        CASE(15)
          FN radioGroup(15, 1, 25)
          gZone% = -2
        CASE(16)
          FN radioGroup(16, 1, 25)
          gZone% = -3
        CASE(17)
          FN radioGroup(17, 1, 25)
          gZone% = -4
        CASE(18)
          FN radioGroup(18, 1, 25)
          gZone% = -5
        CASE(19)
          FN radioGroup(19, 1, 25)
          gZone% = -6
        CASE(20)
          FN radioGroup(20, 1, 25)
          gZone% = -7
        CASE(21)
          FN radioGroup(21, 1, 25)
          gZone% = -8
        CASE(22)
          FN radioGroup(22, 1, 25)
          gZone% = -9
        CASE(23)
          FN radioGroup(23, 1, 25)
          gZone% = -10
        CASE(24)
          FN radioGroup(24, 1, 25)
          gZone% = -11
        CASE(25)
          FN radioGroup(25, 1, 25)
          gZone% = -12

        CASE(26)
          gProgramEnds = true

        CASE (28)
          LONG IF BUTTON (28) = 1
            BUTTON  28, _markedBtn
            gSelZoneDS% = _ztrue
          XELSE
            BUTTON 28, 1
            gSelZoneDS% = _false
          END IF


      END SELECT

      FN doTimer
  END SELECT
END FN


LOCAL FN doMenu
  menuID% = MENU(_menuID)
  itemID% = MENU(_itemID)

  SELECT menuID%
    CASE(1)
      SELECT itemID%
        CASE(1)
          END
      END SELECT
    CASE(3)
      SELECT itemID%
        CASE(1)
          FN showMap
          MENU 3,1, _disable
          MENU 3,2, _enable
        CASE(2)
          WINDOW CLOSE #2
          MENU 3,1, _enable
          MENU 3,2, _disable
      END SELECT
  END SELECT

  MENU
END FN

'---------------------- Main -------------------------
WINDOW OFF
COORDINATE WINDOW

ON DIALOG FN doDialog
ON MENU FN doMenu
ON TIMER(1) FN doTimer


FN mainBuild
FN GetLocation

DO
  HANDLEEVENTS
UNTIL gProgramEnds

'---------------------- End -------------------------


Regards,

Chris Wyatt, in Bendigo, Victoria, Australia.