LINUX.ORG.RU

Поведение команды date при изменении переменной TZ

 


0

1

Вчера мои близкие задались вопросом, где во сколько наступает новый год. Для выяснения этого вопроса мы восользовались старинным труёвым методом:

dimss@kolobok:~$ TZ=Asia/Tokyo date
Tue  1 Jan 21:13:35 JST 2019
dimss@kolobok:~$

Но при этом выявили одну неприятную особенность этого метода: неправильно указанный часовой пояс приводит к неправильному результату без какого-либо сообщения об ошибке.

dimss@kolobok:~$ TZ=EET date ; echo $? # Правильно
Tue  1 Jan 14:14:59 EET 2019
0
dimss@kolobok:~$ TZ=EEST date ; echo $? # Неправильно
Tue  1 Jan 12:15:00 EEST 2019
0
dimss@kolobok:~$ TZ=Asia/Tokyo date ; echo $? # Правильно
Tue  1 Jan 21:15:09 JST 2019
0
dimss@kolobok:~$ TZ=Asia/Tokio date ; echo $? # Неправильно
Tue  1 Jan 12:15:14 Asia 2019
0
dimss@kolobok:~$ TZ=Europe/Moscow date ; echo $? # Правильно
Tue  1 Jan 15:15:22 MSK 2019
0
dimss@kolobok:~$ TZ=Russia/Moscow date ; echo $? # Неправильно
Tue  1 Jan 12:15:29 Russia 2019
0
dimss@kolobok:~$ TZ=xren date ; echo $? # Ну, вы поняли
Tue  1 Jan 12:15:35 xren 2019
0
dimss@kolobok:~$

Как вы думаете, это баг или фича?

Deleted

Вчера задумался над этим вопросом. Потом забил.

mord0d ★★★★★
()

как date определит что TZ неправильный?!

anonymous
()

Как мне кажется, проблема в том, что при неправильной TZ date всё равно указывает её значение в выводе. FreeBSD'шный date указывает UTC, думаю так проще понять что TZ задан неправильно:

$ TZ=EST date
Thu Jan  3 02:45:24 EST 2019
$ TZ=xren date
Thu Jan  3 07:48:39 UTC 2019
Deleted
()
Ответ на: комментарий от Deleted

Тут в соседней ветке как раз интересовались, зачем в 2019 году нужно FreeBSD.

Придется углубиться в историю вопроса...

Deleted
()
Ответ на: комментарий от Deleted

Нужно хотя бы для сравнения; я, используя FreeBSD, часто сравниваю вывод утилит или поведение стандартных функций с debian.

А по теме, POSIX не определяет поведение при неправильной TZ ни для date, ни для strftime(), который date использует.

Deleted
()
Ответ на: комментарий от Deleted

В Busybox всё правильно - возвращает UTC, как и FreeBSD. Судя по коду, дело не в strftime(), а localtime() и tzset().

Вот кусочек функции tzset() в MUSL:

	if (!s) s = __utc;
	getname(std_name, &s);
	__tzname[0] = std_name;
	__timezone = getoff(&s);
	getname(dst_name, &s);
	__tzname[1] = dst_name;

Сейчас полезу смотреть GNU Libc...

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.