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
u2-users@listserver.u2ug.org
To unsubscribe please visit http://listserver.u2ug.org/

Reply via email to