GNU bug report logs - #11281
DST has not effect on windows XP when system DST adjustment is disabled

Previous Next

Package: emacs;

Reported by: Shuguang Sun <shuguang <at> gmail.com>

Date: Thu, 19 Apr 2012 16:46:01 UTC

Severity: minor

Done: Stefan Kangas <stefan <at> marxist.se>

Full log


Message #53 received at 11281 <at> debbugs.gnu.org (full text, mbox):

From: Kazuhiro Ito <kzhr <at> d1.dion.ne.jp>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: 11281 <at> debbugs.gnu.org, stefankangas <at> gmail.com
Subject: Re: bug#11281: DST has not effect on windows XP when system DST
 adjustment is disabled
Date: Sat, 24 May 2025 13:32:54 +0900
> > > (let ((time (encode-time '(0 0 12 20 5 2025 nil nil t))))
> > >   (setenv "TZ" nil)
> > >   (decode-time time "est5edt"))
> > > 
> > > Expected result: (0 0 8 20 5 2025 2 t -14400)
> > > Actual result:   (0 0 7 20 5 2025 2 t -18000)
> > > 
> > > As far as I tested, the result depends on whether DST is enabled in
> > > the Windows Control Panel at the time of evaluating `(setenv "TZ"
> > > nil)'.  In the case of Windows timezone which doesn't have DST, the
> > > result is the same with unchecking DST option.
> > 
> > I think this is because MSVCRT routines assume that every time zone
> > has DST and changes to and from DST on certain fixed dates.  IOW, they
> > don't support timezones without DST and don't access the Windows
> > settings for the actual timezone you are using.  So the conversion to
> > EST5EDT is performed as if your timezone also had DST and the DST were
> > in effect at that date.
> 
> Note that this:
> 
>   (let ((time (encode-time '(0 0 12 20 5 2025 nil nil t))))
>     (setenv "TZ" "JST-9")
>     (decode-time time "est5edt"))
> 
> yields the expected result.

Yes, but it is true only if you had never called `(setenv "TZ" nil)'.
Your example yields unexpected result if TZ environmental variable is
not set at starting emacs (and it is Windows's default).  Probably you
set TZ environmental variable.

;; After setting timezone without DST in the Windows Control Panel
$ TZ= emacs -Q

(let ((time (encode-time '(0 0 12 20 5 2025 nil nil t))))
  (setenv "TZ" "JST-9")
  (decode-time time "est5edt"))

-> unexpected result

So, following code would fail too.

(let ((time (encode-time '(0 0 12 20 5 2025 nil nil t))))
  ;; After setting timezone without DST in the Windows Control Panel
  (setenv "TZ" nil)
  (setenv "TZ" "JST-9")
  (decode-time time "est5edt"))

-> unexpected result

> That is, as long as you tell MSVCRT that
> your current timezone doesn't use DST, the conversion is correct.

As I wrote above, this problem occurs after you once call `(setenv
"TZ" nil)' under setting that system timezone is non-DST
timezone.  If you don't set TZ to nil, conversion would always
succeed.

$ TZ=est5edt emacs -Q

(let ((time (encode-time '(0 0 12 20 5 2025 nil nil t))))
  (setenv "TZ" "JST-9t")
  (decode-time time "est5edt"))

-> expected result

(let ((time (encode-time '(0 0 12 20 5 2025 nil nil t))))
  (setenv "TZ" "pst8pdt")
  (decode-time time "est5edt"))

-> expected result

-- 
Kazuhiro Ito




This bug report was last modified 17 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.