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/