Here's a version for QB (should still work in FB too); I made a few small aesthetic changes.
(I didn't feel like writing validation code, so I made sure the input was always valid.
Code:
DECLARE FUNCTION pickzone% (title AS STRING)
DECLARE FUNCTION gmtoffsettostring$ (gmtoffset AS INTEGER)
DECLARE FUNCTION picktime% (title AS STRING, h AS INTEGER, m AS INTEGER)
DECLARE FUNCTION zerostring$ (n AS INTEGER, chars AS INTEGER)
'' tzconv.bas - timezone converter
'' 29-Jul-2005 - DrV - initial version
'' 29-Jul-2005 - DrV - modified to work with QB, plus some minor visual tweaks
''option explicit
DEFINT A-Z
tzdata:
DATA "London", 0
DATA "Reykjavik", -1
DATA "Greenland", -2
DATA "Rio de Janeiro, Brazil", -3
DATA "Santiago de Chile", -4
DATA "New York", -5
DATA "Chicago", -6
DATA "Denver", -7
DATA "Seattle", -8
DATA "Alaska", -9
DATA "Honolulu", -10
DATA "Midway Island", -11
'' no GMT - 12
DATA "New Zealand", 12
DATA "Solomon Islands", 11
DATA "Sydney", 10
DATA "Tokyo", 9
DATA "Hong Kong and China", 8 '' obsolete? Hong Kong is once again part of China..
DATA "Bangkok", 7
DATA "Omsk, Russia", 6
DATA "Karachi", 5
DATA "Stalingrad", 4
DATA "Moscow", 3
DATA "Cairo", 2
DATA "Berlin", 1
TYPE TimeZone
place AS STRING * 22
gmtoffset AS INTEGER
END TYPE
DIM SHARED zones(23) AS TimeZone
'DECLARE FUNCTION pickzone% (title AS STRING)
'DECLARE FUNCTION gmtoffsettostring$ (gmtoffset AS INTEGER)
'DECLARE FUNCTION picktime (title AS STRING, h AS INTEGER, m AS INTEGER)
'DECLARE FUNCTION zerostring$ (n AS INTEGER, chars AS INTEGER)
DIM i AS INTEGER, s AS STRING, n AS INTEGER
DIM localzone AS INTEGER, remotezone AS INTEGER
DIM localtime AS STRING
DIM h AS INTEGER, m AS INTEGER, d AS INTEGER
DIM number AS STRING
'' get data
RESTORE tzdata
FOR i = 0 TO UBOUND(zones)
READ s, number
n = VAL(number)
zones(i).place = s
zones(i).gmtoffset = n
NEXT i
localzone = pickzone("Local time zone (arrow keys to select, Enter to accept)")
IF localzone = -1 THEN END
remotezone = pickzone("Remote time zone (arrow keys to select, Enter to accept) ")
IF remotezone = -1 THEN END
PRINT "Local time zone: "; zones(localzone).place;
PRINT gmtoffsettostring$(zones(localzone).gmtoffset)
PRINT "Remote time zone: "; zones(remotezone).place;
PRINT gmtoffsettostring$(zones(remotezone).gmtoffset)
PRINT
PRINT "Enter local time (up/down keys to change field, left/right keys to select field, Enter to accept) (24-hour format)"
PRINT
IF picktime("Local time:", h, m) = -1 THEN END
'' calculate remote time
h = h - zones(localzone).gmtoffset
h = h + zones(remotezone).gmtoffset
IF h < 0 THEN
d = -1
h = h + 24
ELSEIF h > 23 THEN
d = 1
h = h - 24
END IF
PRINT
COLOR 7
PRINT "Remote time: "
COLOR 15
PRINT zerostring$(h, 2); ":"; zerostring$(m, 2); " ";
IF d < 0 THEN
PRINT "-";
ELSEIF d > 0 THEN
PRINT "+";
ELSE
PRINT
END IF
IF d <> 0 THEN PRINT zerostring$(ABS(d), 1); " day"
COLOR 7
PRINT
PRINT "Press any key to exit..."
DO WHILE LEN(INKEY$) = 0
LOOP
DEFSNG A-Z
FUNCTION gmtoffsettostring$ (gmtoffset AS INTEGER)
IF gmtoffset > 0 THEN
gmtoffsettostring = "GMT +" + STR$(gmtoffset)
ELSE
gmtoffsettostring = "GMT -" + STR$(-gmtoffset)
END IF
END FUNCTION
FUNCTION picktime% (title AS STRING, h AS INTEGER, m AS INTEGER)
DIM row AS INTEGER, hr AS INTEGER, mn AS INTEGER, ed AS INTEGER
DIM k AS STRING
PRINT title
COLOR 15
row = CSRLIN
hr = 0
mn = 0
ed = 0
LOCATE row, 1, 0 ' hide cursor
PRINT zerostring(hr, 2); ":"; zerostring(mn, 2)
PRINT "^^";
DO
k = INKEY$
IF LEN(k) = 1 THEN
IF k = CHR$(10) OR k = CHR$(13) THEN
h = hr
m = mn
picktime = 0
EXIT DO
ELSEIF k = CHR$(27) THEN
picktime = -1
EXIT DO
END IF
ELSEIF LEN(k) = 2 THEN
IF ed = 0 THEN
SELECT CASE ASC(RIGHT$(k, 1))
CASE 77 ' right
ed = 1
LOCATE row + 1, 1
PRINT " ^^";
CASE 72 ' up
hr = hr + 1
IF hr >= 24 THEN hr = 0
LOCATE row, 1
PRINT zerostring(hr, 2);
CASE 80 ' down
hr = hr - 1
IF hr <= -1 THEN hr = 23
LOCATE row, 1
PRINT zerostring(hr, 2);
END SELECT
ELSE
SELECT CASE ASC(RIGHT$(k, 1))
CASE 75 ' left
ed = 0
LOCATE row + 1, 1
PRINT "^^ ";
CASE 72 ' up
mn = mn + 1
IF mn >= 60 THEN mn = 0
LOCATE row, 4
PRINT zerostring(mn, 2);
CASE 80 ' down
mn = mn - 1
IF mn <= -1 THEN mn = 60
LOCATE row, 4
PRINT zerostring(mn, 2);
END SELECT
END IF
END IF
LOOP
LOCATE row + 1, 1
PRINT " ";
LOCATE row + 1, 1, 1 ' show cursor
END FUNCTION
FUNCTION pickzone% (title AS STRING)
DIM i AS INTEGER, s AS STRING
DIM k AS STRING
DIM curr AS INTEGER
CLS
LOCATE 1, 1, 0 ' hide cursor
PRINT title
FOR i = 0 TO 23
LOCATE 2 + i, 3
PRINT zones(i).place;
LOCATE 2 + i, 3 + 30 + 1
PRINT gmtoffsettostring(zones(i).gmtoffset);
NEXT i
curr = 0
LOCATE curr + 2, 1
PRINT ">";
DO
k = INKEY$
IF LEN(k) = 1 THEN
IF k = CHR$(13) OR k = CHR$(10) THEN
pickzone = curr
EXIT DO
ELSEIF k = CHR$(27) THEN ' escape
pickzone = -1
EXIT DO
END IF
ELSEIF LEN(k) = 2 THEN
SELECT CASE ASC(RIGHT$(k, 1))
CASE 80, 77 ' down, right
IF curr < UBOUND(zones) THEN
LOCATE curr + 2, 1
PRINT " ";
curr = curr + 1
LOCATE curr + 2, 1
PRINT ">";
END IF
CASE 72, 75 ' up, left
IF curr > 0 THEN
LOCATE curr + 2, 1
PRINT " ";
curr = curr - 1
LOCATE curr + 2, 1
PRINT ">";
END IF
END SELECT
END IF
LOOP
exitfunc:
CLS
LOCATE 1, 1, 1 ' show cursor
END FUNCTION
FUNCTION zerostring$ (n AS INTEGER, chars AS INTEGER)
DIM s AS STRING
s = LTRIM$(RTRIM$(STR$(n)))
IF LEN(s) < chars THEN
s = STRING$(chars - LEN(s), ASC("0")) + s
END IF
zerostring = s
END FUNCTION