Page 2 of 3

Posted: Sun Jul 31, 2005 2:53 am
by Seb McClouth
Okay... I've taken the first code and implented the method which I used
to calculate with in the 2nd version...

This is what came out:

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 
PRINT "Enter FROM timezone: "; : INPUT "", FTz% 
PRINT "Enter GMT" + GA$(LTRIM$(RTRIM$(STR$(FTz%)))) + " respective time as e.g. 14:00: "; : INPUT "", LocalTime$ 
PRINT : PRINT "Enter TO timezone: "; : INPUT "", TTz% 

IF FTz% <= -12 THEN FTz% = 12                    'As stated, -12 doesn't exist. 
IF FTz% > 12 THEN FTz% = -11                     'Not sure if this is correct, but it 
IF TTz% <= -12 THEN TTz% = 12                    'seems logical. 
IF TTz% > 12 THEN TTz% = -11

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

'First we bring LocalTime$ back to GMT: 
NLocalTime% = VAL(LEFT$(LocalTime$, 2)) 

IF NLocalTime% - FTz% < 0 OR NLocalTime% - FTz% > 24 THEN 
  IF NLocalTime% - FTz% < 0 THEN 
    NTTime% = 24 - (NLocalTime% - FTz%) 
    NDateAdjust = -1 
  ELSEIF NLocalTime% - FTz% > 24 THEN 
    NTTime% = (NLocalTime% - FTz%) - 24 
    NDateAdjust = 1 
  END IF 
ELSE 
  NTTime% = (NLocalTime% - FTz%) 
  NDateAdjust = 0 
END IF 

'Okay, we moved FTz% to GMT, now we gonna move GMT to TTz% 
IF NTTime% + TTz% < 0 OR NTTime% + TTz% > 24 THEN 
  IF NTTime% + TTz% < 0 THEN 
    TTime% = 24 - (NTTime% + TTz%) 
    NDateAdjust = -1 
  ELSEIF NTTime% + TTz% > 24 THEN 
    TTime% = (NTTime% + TTz%) - 24 
    NDateAdjust = 1 
  END IF 
ELSE 
  TTime% = (NTTime% + TTz%) 
  DateAdjust = 0 
END IF 
ToTime$ = LTRIM$(RTRIM$(STR$(TTime%))) + ":" + RIGHT$(LocalTime$, 2) 

'The DateAdjust?
NTime% = VAL(LEFT$(LocalTime$, 2))      'Retrieve the hours from LocalTime$ 

TzToPass% = -FTz% + TTz%                'Get the total timezones to pass 

N2Time% = NTime% + TzToPass%            'Calculate the NewTime 


IF N2Time% < 0 THEN                     'If N2Time% goes below zero 
   DateAdjust = -1                        'Date needs adjustment 
ELSEIF N2Time% > 23 THEN                'If N2Time% goes over 24 
   DateAdjust = 1                         'Date needs adjustment 
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$(ToTime$)); 
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
I hope this works.

Posted: Sun Jul 31, 2005 6:59 pm
by moneo
Seb,

It was running real good until I entered the following:

FROM: GMT -5
time at FROM: 01:00
TO....: GMT -7

Result said it was 25:00 at GMT-7 ....(It should be 23:00)
with a date adjustment of -1 which is correct.

Should be a minor problem. Fix it and we'll try again.
*****

Posted: Mon Aug 01, 2005 1:01 pm
by SebMcClouth
Minor problem... I can't fix yet... I'm trying it with some other code I've coded... Darn... It should have worked just fine... Well... back to the drawing table...

grtz
Seb

Posted: Mon Aug 01, 2005 1:51 pm
by SebMcClouth
Okay... back.. I think I found the bug... My mathematics part... I rewrote (not rebuild) it... (Back the the drawing table hehehe)... I wrote all the math down on a paper and started from scratch with that... A tiny adjustment... and voila:

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
PRINT "Enter FROM timezone: "; : INPUT "", FTz%
PRINT "Enter GMT" + GA$(LTRIM$(RTRIM$(STR$(FTz%)))) + " respective time as e.g. 14:00: "; : INPUT "", LocalTime$
PRINT : PRINT "Enter TO timezone: "; : INPUT "", TTz%

IF FTz% <= -12 THEN FTz% = 12                    'As stated, -12 doesn't exist.
IF FTz% > 12 THEN FTz% = -11                     'Not sure if this is correct, but it
IF TTz% <= -12 THEN TTz% = 12                    'seems logical.
IF TTz% > 12 THEN TTz% = -11

'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% > 24 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%

IF Temp2Time% < 0 THEN                  'If Temp2Time% < 0 then
  Temp2Time% = 24 + Temp2Time%             'Temp2Time% = 24 - Temp2Time%
ELSE                                    'Else
  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
I think this is version 7... The problem you had... should be corrected...
FROM: GMT -5
time at FROM: 01:00
TO....: GMT -7

Result said it was 25:00 at GMT-7 ....(It should be 23:00)
with a date adjustment of -1 which is correct.
I checked it... and you were right... It now should show:
FROM: GMT -5
time at FROM: 01:00
TO....: GMT -7
time at TO: 23:00
Date adjust = -1
According to my test that is... let me know if you find anymore bugs...

grtz

Seb

Posted: Tue Aug 02, 2005 8:54 am
by Seb McClouth
So... you're doing the same challenge on www.qbasicnews.com... How's it going there??

grtz
Seb

Posted: Tue Aug 02, 2005 6:05 pm
by moneo
Seb McClouth wrote:So... you're doing the same challenge on www.qbasicnews.com... How's it going there??

grtz
Seb
At QBN we have a brilliant 100% solution posted by DrV.

We have another solution which gives the correct time at the TO timezone, but still has problems with the "date adjustment".

Another guy modified the specs and invented his own thing. However, the TO timezone time calculation seems to work.
*****

Posted: Wed Aug 03, 2005 1:10 am
by SebMcClouth
hows mine working now??

grtz

Posted: Wed Aug 03, 2005 2:25 pm
by moneo
SebMcClouth wrote:hows mine working now??

grtz
Seb,

You still have some problem. The first one I tried didn't work.
FROM GMT-5 with time = 14:00
TO.... GMT+9

Result time at TO says 52:00 which is invalid.

Other tests also produced invalid times greater than 23:59.

Do some additional testing before you submit. Sorry.
*****

Posted: Wed Aug 03, 2005 11:38 pm
by SebMcClouth
This is one of the reasons why it is good to have an old laptop as programpc: you can read here and program on the other...

The problem as you state... must be sumfin wrong in my math...

I did several re-runs and found out that where there had to be - there was a +.

Timezone calculator updates:
  • nr 1:

    Code: Select all

    IF HourGMTTime% < 0 THEN
      HourGMTTime% = 24 + HourGMTTime%
    ELSEIF HourGMTTime% > 23 THEN
      HourGMTTime% = HourGMTTime% - 24
    END IF
    nr2:

    Code: Select all

    IF Temp2Time% < 0 THEN
      Temp2Time% = 24 + Temp2Time%
    ELSEIF Temp2Time% > 23 THEN
      Temp2Time% = Temp2Time% - 24
    END IF
grtz
Seb

Posted: Wed Aug 03, 2005 11:47 pm
by SebMcClouth
Just to be nice... version 8 of UTC.bas (as I have named it):

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
PRINT "Enter FROM timezone: "; : INPUT "", FTz%
PRINT "Enter GMT" + GA$(LTRIM$(RTRIM$(STR$(FTz%)))) + " respective time as e.g. 14:00: "; : INPUT "", LocalTime$
PRINT : PRINT "Enter TO timezone: "; : INPUT "", TTz%

IF FTz% <= -12 THEN FTz% = 12                    'As stated, -12 doesn't exist.
IF FTz% > 12 THEN FTz% = -11                     'Not sure if this is correct, but it
IF TTz% <= -12 THEN TTz% = 12                    'seems logical.
IF TTz% > 12 THEN TTz% = -11

'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

Posted: Thu Aug 04, 2005 7:42 pm
by moneo
Wonderful, Seb, you finally have a solid working version. Everything I tried works great!

You should be commended for sticking to it and never giving up until you got it working.

One minor criticism: You never added the validation of the input timezone and time, like you said you would. You should do this on future programs so they don't produce erroneous output.

You are the WINNER of this challenge. Congratulations! :D
*****

Posted: Thu Aug 04, 2005 7:57 pm
by moneo
Friends,

Here's my own version of the timezone program which I had working since 21-Jul-2005. There are lines here and there that are not "structured code", but that's what I was thinking at the time. All input is completely validated as you can notice.

Some of the city names may need updating. I got the list from a 1960 version of the World Book Encyclopedia.

Any comments will be well received and appreciated.
*****

Code: Select all

defint a-z
DECLARE FUNCTION   NumStrict    (Z$)

dim tz (1 to 24)
dim tn$(1 to 24)
tz(1)=0   :tn$(1)="London"
tz(2)=-1  :tn$(2)="Reykjavik"
tz(3)=-2  :tn$(3)="Greenland"
tz(4)=-3  :tn$(4)="Rio de Janeiro"
tz(5)=-4  :tn$(5)="Santiago de Chile"
tz(6)=-5  :tn$(6)="New York"
tz(7)=-6  :tn$(7)="Chicago"
tz(8)=-7  :tn$(8)="Denver"
tz(9)=-8  :tn$(9)="Seattle"
tz(10)=-9  :tn$(10)="Alaska"
tz(11)=-10 :tn$(11)="Honolulu"
tz(12)=-11 :tn$(12)="Midway Is."
tz(13)=+12 :tn$(13)="New Zealand"
tz(14)=+11 :tn$(14)="Solomon Is."
tz(15)=+10 :tn$(15)="Sydney"
tz(16)=+9  :tn$(16)="Tokyo"
tz(17)=+8  :tn$(17)="China"
tz(18)=+7  :tn$(18)="Bangkok"
tz(19)=+6  :tn$(19)="Omsk"
tz(20)=+5  :tn$(20)="Karachi"
tz(21)=+4  :tn$(21)="Stalingrad"
tz(22)=+3  :tn$(22)="Moscow"
tz(23)=+2  :tn$(23)="Cairo"
tz(24)=+1  :tn$(24)="Berlin"

getfrom:
Print "Enter FROM timezone as GMT0, GMT+nn, or GMT-nn ";
gosub getgmt
if gmterr=1 then print "Invalid timezone":goto getfrom
fromzone=gmtzone
fromname$=zonename$
fromgmt$=gmt$

gettime:
Print "Enter military time (hh:mm) for FROM timezone ";
input ztime$
ztime$=ltrim$(rtrim$(ztime$))
if mid$(ztime$,3,1)<>":" or len(ztime$)<>5 then print "Invalid time":goto gettime
z$=left$(ztime$,2)+right$(ztime$,2)
if not NumStrict(z$) then print "Invalid time":goto gettime
hh=val(left$(z$,2))
mm$=right$(z$,2)
if hh>23 or mm>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
tozone=gmtzone
toname$=zonename$
togmt$=gmt$
if tozone=fromzone then print "FROM and TO timezones must be different":goto getto

rem ***** MAIN PROCESS *****

if fromzone<0 then fromsign$="-" else fromsign$="+"
if   tozone<0 then tosign$  ="-" else   tosign$="+"
from.to.sign$=fromsign$+tosign$

afrom = abs(fromzone)
ato   = abs(tozone)
days$="0"

SELECT CASE from.to.sign$
  CASE "-+" 
       difhours=afrom+ato
  CASE "--"
       if afrom<ato then  
          difhours= -(ato-afrom)
       else
          rem from is greater.
          difhours=afrom-ato
       end if
  CASE "++" 
       if afrom<ato then 
          difhours= ato-afrom
       else
          difhours= -(afrom-ato)
       end if
  CASE "+-"   
       rem difhours=ato+afrom
       difhours=-(afrom+ato)
  CASE ELSE
       print "SYSERR: invalid +- variable":system
END SELECT

tohh=hh+difhours
if tohh<0 then  tohh=tohh+24 : days$="-1" : goto gothh
if tohh>23 then tohh=tohh-24 : days$="+1" 
gothh:

print
rem print "FROM zone is GMT";fromzone;"  ";fromname$
rem print "TO   zone is GMT";  tozone;"  ";toname$
print "FROM zone is ";fromgmt$;"  ";fromname$
print "TO   zone is ";  togmt$;"  ";toname$
if difhours<0 then signh$="-" else signh$="+"
print "Time at FROM zone is ";right$("00"+ltrim$(str$(hh)),2);":";mm$
print "dif in hours is ";signh$;ltrim$(str$(abs(difhours)))
print "Time at TO   zone is ";right$("00"+ltrim$(str$(tohh)),2);":";mm$
print "Date adjustment for TO zone is ";days$

system

getgmt:
  gmterr=0  'assume no error
  input gmt$
  gmt$=ucase$(ltrim$(rtrim$(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:
  found=0
  for x=1 to 24
      if tz(x)=gmtzone then found=1:exit for
  next x
  if found=0 then print "SYSERR: zone not found on table":system
  zonename$=tn$(x)

return '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

END

FUNCTION NumStrict (Z$)

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

  NumStrict=0         'Init to False

  IF Z$="" THEN EXIT FUNCTION

  FOR X = 1 TO LEN(Z$)
      A=ASC(MID$(Z$,X,1))
      IF A<48 OR A>57 THEN EXIT FUNCTION
  NEXT X

  NumStrict = -1          'True

END FUNCTION

Posted: Thu Aug 04, 2005 11:18 pm
by SebMcClouth
One minor criticism: You never added the validation of the input timezone and time, like you said you would. You should do this on future programs so they don't produce erroneous output.
Isn't this some sort of validation?

Code: Select all

IF FTz% <= -12 THEN FTz% = 12                    'As stated, -12 doesn't exist. 
IF FTz% > 12 THEN FTz% = -11                     'Not sure if this is correct, but it 
IF TTz% <= -12 THEN TTz% = 12                    'seems logical. 
IF TTz% > 12 THEN TTz% = -11
I will add a hour-validation as soon as I'm gonna implent in qbinux.

YEAH!! I'm the winner!!! Feels good...

It's was fun... can't wait for the next challenge...

grtz
Seb

Posted: Fri Aug 05, 2005 8:01 pm
by moneo
SebMcClouth wrote:.....

Isn't this some sort of validation?

Code: Select all

IF FTz% <= -12 THEN FTz% = 12                    'As stated, -12 doesn't exist. 
IF FTz% > 12 THEN FTz% = -11                     'Not sure if this is correct, but it 
IF TTz% <= -12 THEN TTz% = 12                    'seems logical. 
IF TTz% > 12 THEN TTz% = -11
No, Seb, that's not validation. That's taking invalid input and forcing it into some default value that you decided. You never warn the user.
Example: If the user is intending to enter timezone -11 but by a keying error enters -21, you'll convert this to 12 which is way off from what he intended.
So, if any input is invalid, advise the user with a meaningful error message, and input again. This is a rule you should follow for any program.
A long time ago, a supervisor asked my why I was sequence checking the input file to my program, when the file just came out of a sort utility. My reply was that I have seen sorts fail due to operator error, and I didn't want my program to produce garbage results with an out of sequence file.
Get the point?
*****

Posted: Sun Aug 07, 2005 5:42 pm
by SebMcClouth
How about me adding the validation and posting the new version?

grtz
Seb

Posted: Sun Aug 07, 2005 5:47 pm
by SebMcClouth
Here's the adjust version:

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. 14:00: "; : INPUT "", LocalTime$ 
IF LEFT$(LocalTime$, 2) < 00 OR LEFT$(LocalTime$, 2) > 23 OR RIGHT$(LocalTime$, 2) < 00 OR 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

Posted: Tue Aug 09, 2005 12:23 pm
by moneo
Seb,

I get 4 compile errors on the following line:

IF LEFT$(LocalTime$, 2) < 00 OR LEFT$(LocalTime$, 2) > 23 OR RIGHT$(LocalTime$, 2) < 00 OR RIGHT$(LocalTIme$, 2) > 59 THEN

You're comparing strings against numerics. To be sure, I'd rather you fix it.
*****

Posted: Tue Aug 09, 2005 12:29 pm
by Seb McClouth
I just wrote them quickly. But you're right, it should be:

Code: Select all

IF str$(LEFT$(LocalTime$, 2)) < 0 OR str$(LEFT$(LocalTime$, 2))> 23 OR str$(RIGHT$(LocalTime$, 2)) < 00 OR str$(RIGHT$(LocalTIme$, 2)) > 59 THEN/code]

I think I'm gonna write a STRIGHT$ and a STLEFT$ funtion... hehehehe.

grtz
Seb

Posted: Tue Aug 09, 2005 4:47 pm
by moneo
Seb McClouth wrote:I just wrote them quickly. But you're right, it should be:

Code: Select all

IF str$(LEFT$(LocalTime$, 2)) < 0 OR str$(LEFT$(LocalTime$, 2))> 23 OR str$(RIGHT$(LocalTime$, 2)) < 00 OR str$(RIGHT$(LocalTIme$, 2)) > 59 THEN/code]

I think I'm gonna write a STRIGHT$ and a STLEFT$ funtion... hehehehe.

grtz
Seb[/quote]
Ooops. I think you meant:
IF VAL(LEFT$(LocalTime$, 2)) < 0 ..........etc.

BUT, even that is not a good numeric check. If the user enters 1X:2Y by mistake, then this logic will not catch the alpha characters and your program will process the above invalid hours of 1X as just hours of 1. The invalid minutes of 2Y will be carried to the final HH:MM displayed.
What this means is that first you must check the HH and MM for numeric. Then you can check if < 0, > 23, etc.

In addition, you should make sure that the user entered the correct HH:MM format for the time. Before the above code, you should do something like this:
IF LEN(LocalTime$)<>5 or MID$(LocalTime$,3,1)<>":" then ..... error

*****

Posted: Wed Aug 10, 2005 2:34 am
by SebMcClouth
Okay, so once again, back to the drawing table!

grtz
Seb