Re: Похоже на багу в date_local в ssi

Igor Sysoev igor на sysoev.ru
Ср Мар 31 11:23:42 MSD 2010


On Tue, Mar 30, 2010 at 09:44:28PM +0400, Maxim Dounin wrote:

> Hello!
> 
> On Tue, Mar 30, 2010 at 08:16:18PM +0400, Igor Sysoev wrote:
> 
> [...]
> 
> > С этим strftime(%s) не просто: под FreeBSD 8.0 такая программка
> > ----------
> > #include <time.h>
> > #include <sys/time.h>
> > #include <stdio.h>
> > 
> > main()
> > {
> >     time_t          t;
> >     struct timeval  tv;
> >     struct tm      *tm;
> >     char            buf[20];
> > 
> >     gettimeofday(&tv, NULL);
> >     printf("GToD: %d\n", tv.tv_sec);
> > 
> >     t = time(NULL);
> >     printf("TIME: %d\n", t);
> > 
> >     tm = gmtime(&t);
> >     strftime(buf, 20, "GMTM: %s", tm);
> >     printf("%s\n", buf);
> > 
> >     tm = localtime(&t);
> >     strftime(buf, 20, "LOCT: %s", tm);
> >     printf("%s\n", buf);
> > }
> > ----------
> > 
> > выдаёт
> > 
> > GToD: 1269965127
> > TIME: 1269965127
> > GMTM: 1269954327
> > LOCT: 1269965127
> > 
> > При том, что date и date +%s выдают соответственно
> > 
> > Tue Mar 30 20:05:27 MSD 2010
> > 
> > 1269965127
> > 
> > То есть, strftime(%s) для GMT выдаёт время на 3 часа меньше UTC (даже не 4).
> 
> Не "для GMT", а при использовании gmtime(), почувствуйте разницу.  
> 3 часа как раз легко объяснимо - флаг is_dst учитывается отдельно.

Насколько я понимаю, из результата gmtime() и localtime() можно получить
число секунд от epoch при условии, что в struct tm есть gmtoff и
tm_isdst (что верно не для всех платформ).

> Вообще стандарта на %s нет, оно приползло из Olson's time zone package, 
> где было вообще "is replaced by the value of the timestamp as a 
> signed decimal integer" (http://www.twinsun.com/tz/timeapi.html), 
> так что судя по всему nobody cares.
> 
> Следуя логике POSIX'а для strftime() для %z/%Z - я думаю 
> правильным будет считать что значение %s unspecified если 
> переданная структура была получена не из localtime().  Код во 
> фряхе неявно предполагает что оно из localtime()'а и зовёт 
> mktime().
> 
> Что касается конкретно nginx'а - то IMHO отличия между $date_gmt и 
> $date_local + TZ=GMT - недопустимы.  Всмысле, не надо всё ломать в 
> обратную сторону, оставь как сейчас.
> 
> Maxim Dounin
> 
> p.s.  В линуксе результаты те же, код не смотрел.

Да, я оставляю как сейчас. Просто был репорт про новое поведение и я стал
изучать этот вопрос.


-- 
Игорь Сысоев
http://sysoev.ru



Подробная информация о списке рассылки nginx-ru