Re: Похоже на багу в date_local в ssi
Maxim Dounin
mdounin на mdounin.ru
Вт Мар 30 21:44:28 MSD 2010
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