Sorry, I forgot about this. I finished it, but forgot to post it.

It doesn't have comments, unfortunately, but it should be fairly simple. Most of the stuff is just error-checking. The actual calculations are only a few lines. No DST was included, as per the revised rules.

[syntax="qbasic"]CONST key$ = "0123456789"

DIM tZone1 AS STRING, date AS STRING, time AS STRING, tZone2 AS STRING

DIM cities(-11 TO 12) AS STRING

FOR i = -11 TO 12

READ cities(i)

NEXT i

CLS

DO

plusMinusCount = 0

CLS

LOCATE 1, 1

INPUT "Enter the timezone you are currently in: ", tZone1

FOR i = 1 TO LEN(tZone1)

IF MID$(tZone1, i, 1) = "-" OR MID$(tZone1, i, 1) = "+" THEN

plusMinusCount = plusMinusCount + 1

IF i <> LEN(tZone1) - 1 AND i <> LEN(tZone1) - 2 THEN

badZone = -1

ELSE

badZone = 0

END IF

IF plusMinusCount > 1 THEN badZone = -1: EXIT FOR

END IF

NEXT i

IF badZone <> -1 THEN

IF INSTR(tZone1, "GMT") <> 0 AND LEN(tZone1) < 7 THEN

IF INSTR(tZone1, "-") = LEN(tZone1) - 2 OR INSTR(tZone1, "+") = LEN(tZone1) - 2 THEN

badZone = 0

plusMinusPos = LEN(tZone1) - 2

ELSEIF INSTR(tZone1, "-") = LEN(tZone1) - 1 OR INSTR(tZone1, "+") = LEN(tZone1) - 1 THEN

badZone = 0

plusMinusPos = LEN(tZone1) - 1

ELSE

badZone = -1

END IF

ELSE

badZone = -1

END IF

IF VAL(RIGHT$(tZone1, plusMinusPos - 1)) > 12 OR VAL(RIGHT$(tZone1, plusMinusPos - 1)) < -11 THEN

badZone = -1

END IF

END IF

LOOP WHILE badZone = -1

DO

dateStr$ = ""

CLS

LOCATE 1, 1

PRINT "Enter the timezone you are currently in: "; tZone1

INPUT "Enter the date you are in that timezone: ", date

FOR i = 1 TO LEN(date)

IF INSTR(key$, MID$(date, i, 1)) <> 0 THEN

dateStr$ = dateStr$ + MID$(date, i, 1)

END IF

NEXT i

IF LEN(dateStr$) = 8 THEN

badDate = 0

ELSE

badDate = -1

END IF

LOOP WHILE badDate = -1

DO

timeStr$ = ""

CLS

LOCATE 1, 1

PRINT "Enter the timezone you are currently in: "; tZone1

PRINT "Enter the date you are in that timezone: "; date

INPUT "Enter the time you are in that timezone: ", time

FOR i = 1 TO LEN(time)

IF INSTR(key$, MID$(time, i, 1)) <> 0 THEN

timeStr$ = timeStr$ + MID$(time, i, 1)

END IF

NEXT i

IF LEN(timeStr$) = 4 THEN

IF VAL(LEFT$(timeStr$, 2)) < 24 AND VAL(RIGHT$(timeStr$, 2)) < 60 THEN

badTime = 0

ELSE

badTime = -1

END IF

ELSEIF LEN(timeStr$) = 3 THEN

timeStr$ = "0" + timeStr$

IF VAL(LEFT$(timeStr$, 2)) < 24 AND VAL(RIGHT$(timeStr$, 2)) < 60 THEN

badTime = 0

ELSE

badTime = -1

END IF

ELSE

badTime = -1

END IF

LOOP WHILE badTime = -1

DO

plusMinusCount2 = 0

CLS

LOCATE 1, 1

PRINT "Enter the timezone you are currently in: "; tZone1

PRINT "Enter the date you are in that timezone: "; date

PRINT "Enter the time you are in that timezone: "; time

INPUT "Enter the timezone you want to find the time for: ", tZone2

FOR i = 1 TO LEN(tZone2)

IF MID$(tZone2, i, 1) = "-" OR MID$(tZone2, i, 1) = "+" THEN

plusMinusCount2 = plusMinusCount2 + 1

IF i <> LEN(tZone2) - 1 AND i <> LEN(tZone2) - 2 THEN

badZone = -1

ELSE

badZone = 0

END IF

IF plusMinusCount2 > 1 THEN badZone = -1: EXIT FOR

END IF

NEXT i

IF badZone <> -1 THEN

IF INSTR(tZone2, "GMT") <> 0 AND LEN(tZone2) < 7 THEN

IF INSTR(tZone2, "-") = LEN(tZone2) - 2 OR INSTR(tZone2, "+") = LEN(tZone2) - 2 THEN

badZone = 0

plusMinusPos2 = LEN(tZone2) - 2

ELSEIF INSTR(tZone2, "-") = LEN(tZone2) - 1 OR INSTR(tZone2, "+") = LEN(tZone2) - 1 THEN

badZone = 0

plusMinusPos2 = LEN(tZone2) - 1

ELSE

badZone = -1

END IF

ELSE

badZone = -1

END IF

IF VAL(RIGHT$(tZone2, plusMinusPos - 1)) > 12 OR VAL(RIGHT$(tZone2, plusMinusPos - 1)) < -11 THEN

badZone = -1

END IF

END IF

LOOP WHILE badZone = -1

gmt = VAL(LEFT$(timeStr$, 2)) + (-1 * VAL(MID$(tZone1, plusMinusPos)))

IF gmt + VAL(MID$(tZone2, plusMinusPos2)) > 24 THEN

MID$(dateStr$, 3, 2) = LTRIM$(STR$(VAL(MID$(dateStr$, 3, 2)) + 1))

hour$ = LTRIM$(STR$((gmt + VAL(MID$(tZone2, plusMinusPos2))) - 24))

ELSEIF gmt + VAL(MID$(tZone2, plusMinusPos2)) < 0 THEN

MID$(dateStr$, 3, 2) = LTRIM$(STR$(VAL(MID$(dateStr$, 3, 2)) - 1))

hour$ = LTRIM$(STR$(24 - ABS(gmt + VAL(MID$(tZone2, plusMinusPos2)))))

ELSE

hour$ = LTRIM$(STR$(gmt + VAL(MID$(tZone2, plusMinusPos2))))

END IF

finalTime$ = hour$ + ":" + RIGHT$(timeStr$, 2)

finalDate$ = LEFT$(dateStr$, 2) + "/" + MID$(dateStr$, 3, 2) + "/" + RIGHT$(dateStr$, 4)

PRINT tZone2, finalDate$, finalTime$, cities(VAL(MID$(tZone2, plusMinusPos2)))

END

DATA "Midway Island","Honolulu","Alaska","Seattle","Denver","Chicago"

DATA "New York","Santiago de Chile","Rio de Janeiro","Greenland","Reykjavik","London"

DATA "Berlin","Cairo","Moscow","Stalingrad","Karachi","Omsk, Russia"

DATA "Bangkok","Hong Kong, and China","Tokyo","Sydney","Solomon Islands","New Zealand"[/syntax]

Of course, there are probably bugs, but I didn't spend much time on it.