ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



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 учитывается отдельно.

Вообще стандарта на %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.  В линуксе результаты те же, код не смотрел.

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.