date manupulation strangeness

Ruslan Ermilov ru at FreeBSD.org
Thu Feb 7 17:00:24 UTC 2008


On Mon, Oct 29, 2007 at 01:19:51AM +0000, Miguel Lopes Santos Ramos wrote:
> > From: Holger Kipp <hk at alogis.com>
> >
> > On Mon, Oct 29, 2007 at 01:35:08AM +0700, Eugene Grosbein wrote:
> > > On Sun, Oct 28, 2007 at 07:20:11PM +0100, Holger Kipp wrote:
> > > 
> > > > > # unixtime=1193511599
> > > > > # LC_ALL=C TZ=Asia/Krasnoyarsk date -jr $unixtime
> > > > > Sun Oct 28 02:59:59 KRAT 2007
> > > 
> > > Here it shows 'Sun Oct 28 02:59:59 KRAST 2007' really
> > > (cut-n-paste error, mea culpa). Take a note of zone name,
> > > KRAST stands for 'KRAsnoyarsk Summer Time' and
> > > KRAT stands for 'KRAsnoyarsk Time' (winter one).
> >
> > ah, I see. I can reproduce it here as well:
> >
> > %setenv LC_ALL C
> > %setenv TZ Asia/Krasnoyarsk
> > %setenv unixtime 1193511599
> >
> > %date -jr $unixtime
> > Sun Oct 28 02:59:59 KRAST 2007
> > %date -jf $s $unixtime
> > Sun Oct 28 02:59:59 KRAT 2007
> > %date -juf %s $unixtime
> > Sat Oct 27 18:59:59 UTC 2007
> > %date -jur $unixtime
> > Sat Oct 27 18:59:59 UTC 2007
> 
> This is a lot of fun! Bugs like this go unnoticed for years...
> It is also very exciting finding people at GMT+8. Mind you, we programmers who live at
> GMT+0 do a lot of timezone errors because we look at a time and often don't know
> whether it's localtime or gmt. At least I do. Then we only find out when we
> change to summer time.
> 
> The problem is of course in src/bin/date.c, line 268. Someone added the
> following on revision 1.32.2.4:
> 267:        /* Let mktime() decide whether summer time is in effect. */
> 268:        lt->tm_isdst = -1;
> 
> Now, who's mktime() to know?
> This line is erasing the output of strptime(), and strptime() knows better than
> anyone what the user might have wanted!
> 
[...]
> There's no point in naming the revision... the problematic line was introduced
> 6 years and 5 months ago by ru... Complete reference: src/bin/date.c Revision 1.32.2.4
> 
> Is ru around?
> 
> Who fills in a pr for this?
> 
> In summary, I think we should move line 268 to line 191 and erase the comment
> on line 267 (mktime() is no one to decide, strptime() must have the final word).
> 
I've committed a different fix, so that it doesn't re-introduce the bug fixed
in rev. 1.36 (or 1.32.2.4, which was an MFC of 1.36).


Cheers,
-- 
Ruslan Ermilov
ru at FreeBSD.org
FreeBSD committer


More information about the freebsd-stable mailing list