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.