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!
*****
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