diff options
Diffstat (limited to 'tcl/generic/tclDate.c')
-rw-r--r-- | tcl/generic/tclDate.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/tcl/generic/tclDate.c b/tcl/generic/tclDate.c index c7d01419618..9b87542c25c 100644 --- a/tcl/generic/tclDate.c +++ b/tcl/generic/tclDate.c @@ -16,7 +16,7 @@ #include "tclInt.h" #include "tclPort.h" -#ifdef MAC_TCL +#if defined(MAC_TCL) && !defined(TCL_MAC_USE_MSL_EPOCH) # define EPOCH 1904 # define START_OF_TIME 1904 # define END_OF_TIME 2039 @@ -579,6 +579,23 @@ RelativeMonth(Start, RelMonth, TimePtr) result = Convert(Month, (time_t) tm->tm_mday, Year, (time_t) tm->tm_hour, (time_t) tm->tm_min, (time_t) tm->tm_sec, MER24, DSTmaybe, &Julian); + + /* + * The Julian time returned above is behind by one day, if "month" + * or "year" is used to specify relative time and the GMT flag is true. + * This problem occurs only when the current time is closer to + * midnight, the difference being not more than its time difference + * with GMT. For example, in US/Pacific time zone, the problem occurs + * whenever the current time is between midnight to 8:00am or 7:00amDST. + * See Bug# 413397 for more details and sample script. + * To resolve this bug, we simply add the number of seconds corresponding + * to timezone difference with GMT to Julian time, if GMT flag is true. + */ + + if (TclDateTimezone == 0) { + Julian += TclpGetTimeZone((unsigned long) Start) * 60L; + } + /* * The following iteration takes into account the case were we jump * into a "short month". Far example, "one month from Jan 31" will @@ -1853,4 +1870,3 @@ case 55:{ goto TclDatestack; /* reset registers in driver code */ } - |