CHALLENGE: Timezone calculator.

Announce and discuss the progress of your various programming-related projects...programs, games, websites, tutorials, libraries...anything!

Moderators: Pete, Mods

moneo
Veteran
Posts: 451
Joined: Tue Jun 28, 2005 7:00 pm
Location: Mexico City, Mexico

Post by moneo »

Seb,

Since you're already the winner of the challenge, adding the logic to validate all the input fields would be a separate exercise to make the program bulletproof. Go ahead if you're really up to it.
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
Guest

Post by Guest »

Is this competition still going> It says so in the latest issue of QB and I qould like to submit an entry.
moneo
Veteran
Posts: 451
Joined: Tue Jun 28, 2005 7:00 pm
Location: Mexico City, Mexico

Post by moneo »

Guest wrote:Is this competition still going> It says so in the latest issue of QB and I qould like to submit an entry.
Sure, go ahead and submit your entry. :D

We already have announced a winner, but we could use a good second place solution.

Kindly register and sign in before submitting your entry, so we know who the solution belongs to.
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
Seb McClouth

Post by Seb McClouth »

What if I beat him to it?

grtz
Seb
Seb McClouth

Post by Seb McClouth »

New version + validation (part 1), the other part I'll write later this day:

Code: Select all

'(C) 2005, by Sebastian McClouth 
DECLARE FUNCTION GA$ (Value AS STRING) 
DECLARE FUNCTION Milit$ (Value AS STRING) 
DECLARE FUNCTION CC$ (Value AS INTEGER) 
CLS 
LOCATE , 20: PRINT "Universal TimeZone Calculator" 
LOCATE , 20: PRINT "-----------------------------" 
LOCATE , 32: PRINT "TIMEZONES:" 
LOCATE , 30: PRINT "GMT  0: LONDON" 
LOCATE , 1: PRINT "GMT -1: REYKJAVIK"; : LOCATE , 48: PRINT "GMT +1: BERLIN" 
LOCATE , 1: PRINT "GMT -2: GREENLAND"; : LOCATE , 48: PRINT "GMT +2: CAIRO" 
LOCATE , 1: PRINT "GMT -3: RIO DE JANEIRO, BRAZIL"; : LOCATE , 48: PRINT "GMT +3: MOSCOW" 
LOCATE , 1: PRINT "GMT -4: SANTIAGO DE CHILE"; : LOCATE , 48: PRINT "GMT +4: STALINGRAD" 
LOCATE , 1: PRINT "GMT -5: NEW YORK"; : LOCATE , 48: PRINT "GMT +5: KARACHI" 
LOCATE , 1: PRINT "GMT -6: CHICAGO"; : LOCATE , 48: PRINT "GMT +6: OMSK, RUSSIA" 
LOCATE , 1: PRINT "GMT -7: DENVER"; : LOCATE , 48: PRINT "GMT +7: BANGKOK" 
LOCATE , 1: PRINT "GMT -8: SEATTLE"; : LOCATE , 48: PRINT "GMT +8: HONG KONG, AND CHINA" 
LOCATE , 1: PRINT "GMT -9: ALASKA"; : LOCATE , 48: PRINT "GMT +9: TOKYO" 
LOCATE , 1: PRINT "GMT-10: HONOLULU"; : LOCATE , 48: PRINT "GMT+10: SYDNEY" 
LOCATE , 1: PRINT "GMT-11: MIDWAY ISLANDS"; : LOCATE , 48: PRINT "GMT+11: SOLOMON ISLANDS" 
LOCATE , 48: PRINT "GMT+12: NEW ZEALAND" 
PRINT 
PRINT STRING$(80, "-") 
PRINT "If giving e.g. GMT+1, etc, give as input 1, etc." 
PRINT 
1 PRINT "Enter FROM timezone: "; : INPUT "", FTz% 
IF FTz% <= -12 or FTz% > 12 THEN 
  PRINT "The chosen timezone is invalid." 
  GOTO 1 
END IF 
2 PRINT "Enter GMT" + GA$(LTRIM$(RTRIM$(STR$(FTz%)))) + " respective time as e.g. 04:00: "; : INPUT "", LocalTime$
IF VAL(LEFT$(LocalTime$, 2)) < 00 OR VAL(LEFT$(LocalTime$, 2)) > 23 OR VAL(RIGHT$(LocalTime$, 2)) < 00 OR VAL(RIGHT$(LocalTIme$, 2)) > 59 THEN 
  PRINT "The chosen time is invalid." 
  GOTO 2 
END IF 
3 PRINT : PRINT "Enter TO timezone: "; : INPUT "", TTz% 
IF TTz% <= -12 or TTz% > 12 THEN 
  PRINT "The chosen timezone is invalid." 
  GOTO 3 
END IF 


'Adjust LocalTime$ from FTz% to TTz% 
'------------------------------------ 
DateAdjust = 0                          'Standard. If not changed not adjust. 

HourLocalTime% = VAL(LEFT$(LocalTime$, 2)) 'Get the hours of LocalTime$ 

'PRINT "Hour(s): "; HourLocalTime% 

Tz2Pass% = -FTz% + TTz%                 'Calculate the timezones of passing 

'PRINT "Timezone(s): "; Tz2Pass% 

HourGMTTime% = HourLocalTime% - FTz%    'Bring HourLocalTime% to HourGMTTime% 

IF HourGMTTime% < 0 THEN                'If HourGMTTime% < 0 then 
  HourGMTTime% = 24 + HourGMTTime%         'HourGMTTime% = 24 + HourGMTTime% 
ELSEIF HourGMTTime% > 23 THEN           'Elseif HourGMTTime% > 24 then 
  HourGMTTime% = HourGMTTime% - 24         'HourGMTTime = HourGMTTime + 24 
END IF 

'PRINT "GMT: "; HourGMTTime%            'We have GMT time... 

Temp2Time% = HourGMTTime% + TTz%        'Bringing HourGMTTime to 2Time% 

'PRINT "Temp2Time%: "; Temp2Time% 

IF Temp2Time% < 0 THEN                  'If Temp2Time% < 0 then 
  Temp2Time% = 24 + Temp2Time%             'Temp2Time% = 24 - Temp2Time% 
ELSEIF Temp2Time% > 23 THEN             'Elseif Temp2Time% > 23 then 
  Temp2Time% = Temp2Time% - 24             'Temp2Time% = Temp2Time% - 24 
END IF 

'PRINT "2Time%: "; Temp2Time% 

TTime$ = LTRIM$(RTRIM$(STR$(Temp2Time%))) 
IF LEN(TTime$) < 2 THEN 
  TTime$ = "0" + TTime$ 
END IF 
TTime$ = TTime$ + RIGHT$(LocalTime$, 3) 

'Date adjust routine 
'------------------- 
'BTW: don't change the above DateAdjust = 0... if you do... trouble... 
DateAdjustTempTime% = HourLocalTime% + Tz2Pass% 

IF DateAdjustTempTime% < 0 THEN 
  DateAdjust = -1 
ELSEIF DateAdjustTempTime% > 23 THEN 
  DateAdjust = 1 
END IF 

PRINT 

LOCATE , 1: PRINT "TIMEZONES:"; 
LOCATE , 20: PRINT "COUNTRY/CITY:"; 
LOCATE , 46: PRINT "LOCAL TIME:"; 
LOCATE , 60: PRINT "APROX. DATE ADJUST:" 
PRINT STRING$(80, "-") 
LOCATE , 1: PRINT "FROM: "; 
LOCATE , 8: PRINT "GMT" + GA$(LTRIM$(RTRIM$(STR$(FTz%)))); 
LOCATE , 20: PRINT CC$(FTz%); 
LOCATE , 46: PRINT LocalTime$ 
LOCATE , 1: PRINT "TO:"; 
LOCATE , 8: PRINT "GMT" + GA$(LTRIM$(RTRIM$(STR$(TTz%)))); 
LOCATE , 20: PRINT CC$(TTz%); 
LOCATE , 46: PRINT LTRIM$(RTRIM$(TTime$)); 
IF LTRIM$(RTRIM$(STR$(DateAdjust))) = "1" THEN 
  LOCATE , 60: PRINT "+1" 
ELSE 
  LOCATE , 60: PRINT LTRIM$(RTRIM$(STR$(DateAdjust))) 
END IF 

FUNCTION CC$ (Value AS INTEGER) 
IF Value = 12 THEN CC$ = "New Zealand" 
IF Value = 11 THEN CC$ = "Solomon Islands" 
IF Value = 10 THEN CC$ = "Sydney" 
IF Value = 9 THEN CC$ = "Tokyo" 
IF Value = 8 THEN CC$ = "Hong Kong, and China" 
IF Value = 7 THEN CC$ = "Bangkok" 
IF Value = 6 THEN CC$ = "Omsk, Russia" 
IF Value = 5 THEN CC$ = "Karachi" 
IF Value = 4 THEN CC$ = "Stalingrad" 
IF Value = 3 THEN CC$ = "Moscow" 
IF Value = 2 THEN CC$ = "Cairo" 
IF Value = 1 THEN CC$ = "Berlin" 
IF Value = 0 THEN CC$ = "London" 
IF Value = -1 THEN CC$ = "Reykjavik" 
IF Value = -2 THEN CC$ = "Greenland" 
IF Value = -3 THEN CC$ = "Rio de Janeiro, Brazil" 
IF Value = -4 THEN CC$ = "Santiago de Chile" 
IF Value = -5 THEN CC$ = "New York" 
IF Value = -6 THEN CC$ = "Chicago" 
IF Value = -7 THEN CC$ = "Denver" 
IF Value = -8 THEN CC$ = "Seattle" 
IF Value = -9 THEN CC$ = "Alaska" 
IF Value = -10 THEN CC$ = "Honolulu" 
IF Value = -11 THEN CC$ = "Midway Island" 
END FUNCTION 

FUNCTION GA$ (Value AS STRING) 
IF VAL(Value) > 0 THEN 
  GA$ = "+" + Value 
ELSEIF Value = "0" THEN 
  GA$ = " " + Value 
ELSE 
  GA$ = Value 
END IF 
END FUNCTION 

FUNCTION Milit$ (Value AS STRING) 
IF LEN(Value) < 5 THEN 
  Milit$ = "0" + Value 
END IF 
END FUNCTION
grtz
Seb
moneo
Veteran
Posts: 451
Joined: Tue Jun 28, 2005 7:00 pm
Location: Mexico City, Mexico

Post by moneo »

Seb,

An improved version from you will certainly be welcome. However, any new version from you will not compete for second place, since you already have the first place position.

BTW, I won't start testing your new version(s) until you let me know which is the definitive final version.
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
Seb McClouth

Post by Seb McClouth »

My final version is an adaption of your own version, which some things of my own.

So actually is our version. I'll post it later, since I don't have access currently... work you know...

grtz
Seb
moneo
Veteran
Posts: 451
Joined: Tue Jun 28, 2005 7:00 pm
Location: Mexico City, Mexico

Post by moneo »

Can't wait to see it, Seb.
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
Seb McClouth

Post by Seb McClouth »

So here it is, a bit longer then expected, I kinda forgot to upload it. Anywayz.

Grtz
Seb

Code: Select all

DEFINT A-Z
DECLARE FUNCTION NumStrict (Value AS STRING)
DECLARE FUNCTION TRIM$ (Value AS STRING)
DECLARE FUNCTION TZN$ (Value AS INTEGER)
DECLARE FUNCTION ValLeft (Value1 AS STRING, Value2 AS INTEGER)
DECLARE FUNCTION ValRight (Value1 AS STRING, Value2 AS INTEGER)

'UTC calculator - written by Moneo, adjusted by Seb McClouth

CLS
LOCATE , 20: PRINT "Universal TimeZone Calculator"
LOCATE , 20: PRINT "-----------------------------"
LOCATE , 32: PRINT "TIMEZONES:"
LOCATE , 30: PRINT "GMT  0: LONDON"
LOCATE , 1: PRINT "GMT -1: REYKJAVIK"; : LOCATE , 48: PRINT "GMT +1: BERLIN"
LOCATE , 1: PRINT "GMT -2: GREENLAND"; : LOCATE , 48: PRINT "GMT +2: CAIRO"
LOCATE , 1: PRINT "GMT -3: RIO DE JANEIRO, BRAZIL"; : LOCATE , 48: PRINT "GMT +3: MOSCOW"
LOCATE , 1: PRINT "GMT -4: SANTIAGO DE CHILE"; : LOCATE , 48: PRINT "GMT +4: STALINGRAD"
LOCATE , 1: PRINT "GMT -5: NEW YORK"; : LOCATE , 48: PRINT "GMT +5: KARACHI"
LOCATE , 1: PRINT "GMT -6: CHICAGO"; : LOCATE , 48: PRINT "GMT +6: OMSK, RUSSIA"
LOCATE , 1: PRINT "GMT -7: DENVER"; : LOCATE , 48: PRINT "GMT +7: BANGKOK"
LOCATE , 1: PRINT "GMT -8: SEATTLE"; : LOCATE , 48: PRINT "GMT +8: HONG KONG, AND CHINA"
LOCATE , 1: PRINT "GMT -9: ALASKA"; : LOCATE , 48: PRINT "GMT +9: TOKYO"
LOCATE , 1: PRINT "GMT-10: HONOLULU"; : LOCATE , 48: PRINT "GMT+10: SYDNEY"
LOCATE , 1: PRINT "GMT-11: MIDWAY ISLANDS"; : LOCATE , 48: PRINT "GMT+11: SOLOMON ISLANDS"
LOCATE , 48: PRINT "GMT+12: NEW ZEALAND"
PRINT
PRINT STRING$(80, "-")



GetFrom:
PRINT "Enter FROM timezone as GMT0, GMT+nn, or GMT-nn: ";
GOSUB GetGMT
IF GMTerr = 1 THEN PRINT "Invalid timezone": GOTO GetFrom
FTz% = GMTzone
FromName$ = ZoneName$
FromGMT$ = GMT$

GetTime:
PRINT "Enter militairy time (hh:mm) e.g. 04:00 for " + FromGMT$ + " : ";
INPUT "", LocalTime$
LocalTime$ = TRIM$(LocalTime$)
IF MID$(LocalTime$, 3, 1) <> ":" OR LEN(LocalTime$) <> 5 THEN PRINT "Invalid time": GOTO GetTime
TLocalTime$ = LEFT$(LocalTime$, 2) + RIGHT$(LocalTime$, 2)
IF NOT NumStrict(TLocalTime$) THEN PRINT "Invalid time": GOTO GetTime
HourLocalTime% = ValLeft(LocalTime$, 2)
MinLocalTime% = ValRight(LocalTime$, 2)
IF HourLocalTime% > 23 OR MinLocalTime% > 59 THEN PRINT "Invalid time": GOTO GetTime

GetTo:
PRINT "Enter TO timezone as GMT0, GMT+nn, or GMT-nn: ";
GOSUB GetGMT
IF GMTerr = 1 THEN PRINT "Invalid timezone": GOTO GetTo
TTz% = GMTzone
ToName$ = ZoneName$
ToGMT$ = GMT$
IF TTz% = FTz% THEN PRINT "FROM and TO timezone must be diffrent": GOTO GetTo

'***** MAIN PROCESS ******
IF FTz% < 0 THEN FromSign$ = "-" ELSE FromSign$ = "+"
IF TTz% < 0 THEN ToSign$ = "-" ELSE ToSign$ = "+"
From.To.Sign$ = FromSign$ + ToSign$

aFTz% = ABS(FTz%)
aTTz% = ABS(TTz%)
Day$ = "0"

SELECT CASE From.To.Sign$
      CASE "-+"
          DifHours = aFTz% + aTTz%
      CASE "--"
          IF aFTz% < aTTz% THEN
            DifHours = -(aTTz% - aFTz%)
          ELSE
            'from is greater
            DifHours = aFTz% - aTTz%
          END IF
      CASE "++"
          IF aFTz% < aTTz% THEN
            DifHours = aTTz% - aFTz%
          ELSE
            DifHours = -(aFTz% - aTTz%)
          END IF
      CASE "+-"
          DifHours = -(aFTz% - aTTz%)
      CASE ELSE
          PRINT "SYSERR: Invalid +-"
END SELECT

ToHour = HourLocalTime + DifHours
IF ToHour < 0 THEN ToHour = ToHour + 24: Day$ = "-1": GOTO GotHour
IF ToHour > 24 THEN ToHour = ToHour - 24: Day$ = "+1": GOTO GotHour


'In future release: include date-routines

GotHour:
PRINT
LOCATE , 1: PRINT "TIMEZONES:";
LOCATE , 20: PRINT "COUNTRY/CITY:";
LOCATE , 46: PRINT "LOCAL TIME:";
LOCATE , 60: PRINT "APROX. DATE ADJUST:"
PRINT STRING$(80, "-")
LOCATE , 1: PRINT "FROM: ";
LOCATE , 8: PRINT FromGMT$;
LOCATE , 20: PRINT FromName$;
LOCATE , 46: PRINT LocalTime$
LOCATE , 1: PRINT "TO: ";
LOCATE , 8: PRINT ToGMT$;
LOCATE , 20: PRINT ToName$;
LOCATE , 46: PRINT RIGHT$("00" + LTRIM$(STR$(ToHour)), 2); ":"; RIGHT$("00" + LTRIM$(STR$(MinLocalTime%)), 2);
LOCATE , 60: PRINT Day$

SYSTEM

GetGMT:
   GMTerr = 0 'Assume no error
   INPUT "", GMT$
   GMT$ = UCASE$(TRIM$(GMT$))
   LGMT = LEN(GMT$)
   IF LEFT$(GMT$, 3) <> "GMT" OR LGMT < 4 OR LGMT > 6 THEN GMTerr = 1: RETURN
   p4$ = MID$(GMT$, 4, 1)
   IF LGMT = 4 AND p4$ = "0" THEN GMTzone = 0: GOTO findName
   IF p4$ <> "+" AND p4$ <> "-" THEN GMTerr = 1: RETURN
   IF LGMT < 5 THEN GMTerr = 1: RETURN
   z$ = MID$(GMT$, 5)
   IF NOT NumStrict(z$) THEN GMTerr = 1: RETURN
   IF p4$ = "-" THEN zmax = 11 ELSE zmax = 12
   GMTzone = VAL(z$)
   IF GMTzone < 1 OR GMTzone > zmax THEN GMTerr = 1: RETURN
   IF p4$ = "-" THEN GMTzone = -GMTzone

findName:
   ZoneName$ = TZN$(GMTzone)

RETURN

END

FUNCTION NumStrict (Value AS STRING)

'*
'*** (NUMSTRICT) - CHECK FOR STRICTLY NUMERIC ONLY (NO NULL NO DECIMAL)
'*

 NumStrict = 0          'Init to False
 IF Value = "" THEN EXIT FUNCTION

 FOR x = 1 TO LEN(Value)
    a = ASC(MID$(Value, x, 1))
    IF a < 48 OR a > 57 THEN EXIT FUNCTION
 NEXT x

 NumStrict = -1         'True

END FUNCTION

FUNCTION TRIM$ (Value AS STRING)
TRIM$ = LTRIM$(RTRIM$(Value))
END FUNCTION

FUNCTION TZN$ (Value AS INTEGER)
IF Value = 12 THEN CC$ = "New Zealand"
IF Value = 11 THEN CC$ = "Solomon Islands"
IF Value = 10 THEN CC$ = "Sydney"
IF Value = 9 THEN CC$ = "Tokyo"
IF Value = 8 THEN CC$ = "Hong Kong, and China"
IF Value = 7 THEN CC$ = "Bangkok"
IF Value = 6 THEN CC$ = "Omsk, Russia"
IF Value = 5 THEN CC$ = "Karachi"
IF Value = 4 THEN CC$ = "Stalingrad"
IF Value = 3 THEN CC$ = "Moscow"
IF Value = 2 THEN CC$ = "Cairo"
IF Value = 1 THEN CC$ = "Berlin"
IF Value = 0 THEN CC$ = "London"
IF Value = -1 THEN CC$ = "Reykjavik"
IF Value = -2 THEN CC$ = "Greenland"
IF Value = -3 THEN CC$ = "Rio de Janeiro, Brazil"
IF Value = -4 THEN CC$ = "Santiago de Chile"
IF Value = -5 THEN CC$ = "New York"
IF Value = -6 THEN CC$ = "Chicago"
IF Value = -7 THEN CC$ = "Denver"
IF Value = -8 THEN CC$ = "Seattle"
IF Value = -9 THEN CC$ = "Alaska"
IF Value = -10 THEN CC$ = "Honolulu"
IF Value = -11 THEN CC$ = "Midway Island"
TZN$ = CC$
END FUNCTION

FUNCTION ValLeft (Value1 AS STRING, Value2 AS INTEGER)
ValLeft = VAL(LEFT$(Value1, Value2))
END FUNCTION

FUNCTION ValRight (Value1 AS STRING, Value2 AS INTEGER)
ValRight = VAL(RIGHT$(Value1, Value2))
END FUNCTION
[/code]
moneo
Veteran
Posts: 451
Joined: Tue Jun 28, 2005 7:00 pm
Location: Mexico City, Mexico

Post by moneo »

Seb,

You used my code on the following line, but you modified the original > 23
to > 24. This does not work. I put the > 23 back and it now works.

Code: Select all

IF ToHour > 24 THEN ToHour = ToHour - 24: Day$ = "+1": GOTO GotHour
A minor point, you misspelled "military time" as "militairy time".

I ran a few tests, and it seems to work the same as my original logic which you mostly incorporated. Unless you made some other typographical errors, since you changed many of my variable names, then "our" new version should work fine.

Nice work. :D
*****
If you are ahead of me, lead.
If you are behind me, follow.
If you are not doing anything,
Get out of the way.
Seb McClouth

Post by Seb McClouth »

I'll do some checks Monday... I should have some time to do it.

grtz
Seb
Post Reply