For a good time, as if you have time to waste, visit
/usr/share/lib/zoneinfo/src.
"So what time is it at the South Pole?"
John Cassidy
Unix Sys Admin
DCCCD
>>> "Don Verhagen" <[EMAIL PROTECTED]> 04/06/06 2:50 PM >>>
I have to agree. We are in 4 times zones in the US and 2 Daylight
Savings Time (Arizona and parts of Indiana do not observe DST). We
store
all our DATES and times in EST.
You have to always include the DATE when dealing with time because
04/04/2006 12:30AM PST is 04/03/2006 11:30PM MST (notice the date).
And
you have to account for Daylight Savings Time.
**** Warning Code Below *****
FUNCTION B.OFFSET.TIME(cDateTime,cToTimeZone,cFromTimeZone)
INCLUDE DMSKELCODE COMMON
**************************************************************************
* Meta Comment Header
*
**************************************************************************
* @AUTHOR = DON
* @CDATE = 03/04/04
* @VERSION = 1.0.39
* @LMOD = 01/19/06}16:36:20}DON
* @SDESC = Convert A Date and Time to An Offet Date and Time
* cDateTime
* <1> - Time To Be Converted (If Blank, Assume Current EST Time)
* <2> - Date (If Blank, Assume Current EST Date
* <3> - Use DST (Y/N) (Default is Y)
* ReturVal
* <1> - Offset Time
* <2> - Offset Date
* Needs a TimeZone Record (EST | CST | MST | PST)
* TZ.REC
* <2> Holds the offset from the BASE ZONE (In this case Base Zone is
EST)
**************************************************************************
ReturnVal = ''
IF LEN(cDateTime<1>) <= 0 THEN cDateTime<1> = TIME()
IF LEN(cDateTime<2>) <= 0 THEN cDateTime<2> = DATE()
IF LEN(cDateTime<3>) <= 0 OR cDateTime<3> # 'N' THEN cDateTime<3> =
'Y'
*
*
OffsetDate = cDateTime<2>
OffsetTime = cDateTime<1> + 0
OffsetYear = OCONV(OffsetDate,'DY')
OffsetDST = (IF cDateTime<3> = 'N' THEN 0 ELSE 1)
**********************************************************
* Determine If Daylight Savings Time is in Effect
* DST Starts on the FIRST Sunday of APRIL
* DST Ends on the LAST Sunday of OCTOBER
**********************************************************
BEGIN CASE
CASE OffsetYear <= 1917
* No Daylight Savings Time
DSTSDate = ''
DSTEDate = ''
CASE OffsetYear >= 1918 AND OffsetYear <= 1919
* Last Sunday Of March / Last Sunday Of October
DSTSDate = ICONV('03/31/':OffsetYear,'D4/')
DSTEDate = ICONV('10/31/':OffsetYear,'D4/')
*
DSTStart.Found = 0
LOOP WHILE (DSTStart.Found = 0) DO
IF OCONV(DSTSDate,'DW') = 0 THEN
DSTStart.Found = 1
END ELSE
DSTSDate -= 1
END
REPEAT
*
DSTEnd.Found = 0
LOOP WHILE (DSTEnd.Found = 0) DO
IF OCONV(DSTEDate,'DW') = 0 THEN
DSTEnd.Found = 1
END ELSE
DSTEDate -= 1
END
REPEAT
CASE OffsetYear >= 1920 AND OffsetYear <= 1941
* No Daylight Savings Time
DSTSDate = ''
DSTEDate = ''
CASE OffsetYear >= 1942 AND OffsetYear <= 1945
* Observed Continuously Due To WWII
DSTSDate = ICONV('02/09/1942','D4/')
DSTEDate = ICONV('09/20/1945','D4/')
CASE OffsetYear >= 1946 AND OffsetYear <= 1965
* No Daylight Savings Time
DSTSDate = ''
DSTEDate = ''
CASE OffsetYear >= 1966 AND OffsetYear <= 1973
* Last Sunday In April, Last Sunday In October
DSTSDate = ICONV('04/30/':OffsetYear,'D4/')
DSTEDate = ICONV('10/31/':OffsetYear,'D4/')
*
DSTStart.Found = 0
LOOP WHILE (DSTStart.Found = 0) DO
IF OCONV(DSTSDate,'DW') = 0 THEN
DSTStart.Found = 1
END ELSE
DSTSDate -= 1
END
REPEAT
*
DSTEnd.Found = 0
LOOP WHILE (DSTEnd.Found = 0) DO
IF OCONV(DSTEDate,'DW') = 0 THEN
DSTEnd.Found = 1
END ELSE
DSTEDate -= 1
END
REPEAT
CASE OffsetYear = 1974
* Changed By The Energy Commission
DSTSDate = ICONV('01/06/1974','D4/')
DSTEDate = ICONV('10/27/1974','D4/')
CASE OffsetYear = 1975
* Changed By The Energy Commission
DSTSDate = ICONV('02/23/1974','D4/')
DSTEDate = ICONV('10/27/1974','D4/')
CASE OffsetYear >= 1976 AND OffsetYear <= 1986
* Last Sunday In April, Last Sunday In October
DSTSDate = ICONV('04/30/':OffsetYear,'D4/')
DSTEDate = ICONV('10/31/':OffsetYear,'D4/')
*
DSTStart.Found = 0
LOOP WHILE (DSTStart.Found = 0) DO
IF OCONV(DSTSDate,'DW') = 0 THEN
DSTStart.Found = 1
END ELSE
DSTSDate -= 1
END
REPEAT
*
DSTEnd.Found = 0
LOOP WHILE (DSTEnd.Found = 0) DO
IF OCONV(DSTEDate,'DW') = 0 THEN
DSTEnd.Found = 1
END ELSE
DSTEDate -= 1
END
REPEAT
CASE OffsetYear >= 1987
* First Sunday In April, Last Sunday In October
DSTSDate = ICONV('04/01/':OffsetYear,'D4/')
DSTEDate = ICONV('10/31/':OffsetYear,'D4/')
*
DSTStart.Found = 0
LOOP WHILE (DSTStart.Found = 0) DO
IF OCONV(DSTSDate,'DW') = 0 THEN
DSTStart.Found = 1
END ELSE
DSTSDate += 1
END
REPEAT
*
DSTEnd.Found = 0
LOOP WHILE (DSTEnd.Found = 0) DO
IF OCONV(DSTEDate,'DW') = 0 THEN
DSTEnd.Found = 1
END ELSE
DSTEDate -= 1
END
REPEAT
END CASE
*
DSTInEffect = (IF OffsetDate < DSTSDate OR OffsetDate > DSTEDate THEN
0
ELSE 1)
*
*IF USER.ID = 'DON' THEN
*
* CALL SB.DISP(3,'DST.IN.EFFECT = ':DSTInEffect:' DSTSDate =
':OCONV(DSTSDate,'D4/'):' DSTEDate = ':OCONV(DSTEDate,'D4/'))
*
*END
* Get Time Zone Information
TO.TZ.KEY = cToTimeZone
TO.TZ.REC = 'Unknown'
TO.TZ.REC<2> = 0
FROM.TZ.KEY = cFromTimeZone
FROM.TZ.REC = 'Unknown'
FROM.TZ.REC<2> = 0
*
OPEN 'TIME.ZONES' TO F.TZ THEN
READ TO.TZ.REC FROM F.TZ,TO.TZ.KEY ELSE NULL
READ FROM.TZ.REC FROM F.TZ,FROM.TZ.KEY ELSE NULL
END
*
TO.OFFSET = (TO.TZ.REC<2> - FROM.TZ.REC<2>)
*CALL SB.DISP(3,TO.TZ.KEY:' - ':FROM.TZ.KEY:' TO.OFFSET = ':TO.OFFSET)
*
nOffsetSeconds = (TO.OFFSET * 3600)
*
OffsetTime = (OffsetTime + nOffsetSeconds)
*
IF NOT(OffsetDST) AND DSTInEffect THEN
* Don't Use Daylight Savings Time
*CALL SB.DISP(3,'ADJUSTING FOR NON-DST')
OffsetTime += (IF TO.OFFSET > 0 THEN (3600) ELSE (-3600)) ;* Minus
One Hour
END
* Day Before?
IF OffsetTime < 0 THEN
OffsetTime = (86400 + OffsetTime)
OffsetDate -= 1
END
*
* Day After?
IF OffsetTime > 86400 THEN
OffsetTime = (OffsetTime - 86400)
OffsetDate += 1
END
*
ReturnVal = OffsetTime
ReturnVal<2> = OffsetDate
ReturnVal<3> = (IF NOT(OffsetDST) THEN 'N' ELSE 'Y')
RETURN ReturnVal
--
Donald Verhagen
Application Development Manager
[EMAIL PROTECTED]
Tandem Staffing Solutions, Inc.
5901 Broken Sound Parkway NW, Suite 450
Boca Raton, FL 33487 USA
Voice Phone: 561.226.8261 Fax Phone: 561.226.8115
>>> On 4/6/2006 at 2:50 pm, in message
<[EMAIL PROTECTED]>,
<[EMAIL PROTECTED]> wrote:
> Nancy,
> I would keep the time stored as-is. I
> can't stress enough that you don't want to store it based on local
time.
> Just tweak it on output. That solves your interstate trucker issues.
12:01
> PM to 4:01 PM is four hours 100% of the time if you store based in a
> single time zone.
> There are a lot of ways to
> tweak on output. The easiest is to set up shell accounts (or real
> accounts, depending on how you slice your data) and put a one line
call in
> all your software something like this, wherever you have
> OCONV(VALUE,'D2/') code:
>
> NOW =
> DATE()
> CALL TIME.CONV(NOW, 'D2/')
> PRINT NOW
>
>
> SUBROUTINE
> TIME.CONV(VALUE,MODE)
> * <comments>
> .
> .
> .
> IF
> ACCT = 'MT' THEN
> <adjust output for Mountain
> Time>
> END ELSE
> <show time as is>
> END
> VALUE = OCONV(VALUE,MODE)
> RETURN
-------
u2-users mailing list
[email protected]
To unsubscribe please visit http://listserver.u2ug.org/
-------
u2-users mailing list
[email protected]
To unsubscribe please visit http://listserver.u2ug.org/