Часовые пояса и расширение tar.lz в Windows

Здравствуйте!

Нам понадобилось вывести список мировых временных зон, чтобы можно было выбрать одну из них.
Для PHP в итоге я смог сделать такой вариант:

function getOptTimeZones($dk_timezone = 0)
{
	// построим select для dk_timezone
	$dk_tzs = array(
-15 => '(GMT -12:00) Эневеток, Кваджалейн',
-14 => '(GMT -11:00) Остров Мидуэй, Самоа',
-13 => '(GMT -10:00) Гавайи',
-12 => '(GMT -9:00) Аляска',
-11 => '(GMT -8:00) Тихоокеанское время (США и Канада), Тихуана',
-10 => '(GMT -7:00) Горное время (США и Канада), Аризона',
-9 => '(GMT -6:00) Центральное время (США и Канада), Мехико',
-8 => '(GMT -5:00) Восточное время (США и Канада), Богота, Лима',
-7 => '(GMT -4:00) Атлантическое время (Канада), Каракас, Ла Пас',
-6 => '(GMT -3:00) Бразилия, Буэнос-Айрес, Джорджтаун',
-5 => '(GMT -2:00) Среднеатлантическое время',
-4 => '(GMT -1:00) Азорские острова, острова Зелёного Мыса',
-3 => '(GMT  0:00) Дублин, Лондон, Лиссабон, Касабланка, Эдинбург',
-2 => '(GMT +1:00) Брюсель, Копенгаген, Мадрид, Париж, Берлин',
-1 => '(GMT +2:00) Афины, Киев, Минск, Бухарест, Рига, Таллин',
0 => '(GMT +3:00) Москва, Санкт-Петербург, Волгоград',
1 => '(GMT +4:00) Абу-Даби, Баку, Тбилиси, Ереван',
2 => '(GMT +5:00) Екатеринбург, Исламабад, Карачи, Ташкент',
3 => '(GMT +6:00) Омск, Новосибирск, Алма-Ата, Астана',
4 => '(GMT +7:00) Красноярск, Норильск, Бангкок, Ханой, Джакарта',
5 => '(GMT +8:00) Иркутск, Пекин, Перт, Сингапур, Гонконг',
6 => '(GMT +9:00) Якутск, Токио, Сеул, Осака, Саппоро',
7 => '(GMT +10:00) Владивосток, Восточная Австралия, Гуам',
8 => '(GMT +11:00) Магадан, Сахалин, Соломоновы Острова',
9 => '(GMT +12:00) Камчатка, Окленд, Уэллингтон, Фиджи');
 
	$s = '';
 
	for($i = -15; $i < 10; $i++) {
		$s .= '<option value="' . $i . '"';
		if($i == $dk_timezone)
			$s .= ' selected';
		$s .= '>' . $dk_tzs[$i] . '</option>';
	}
 
        return $s;
}

То есть мы построили список из option элементов для select‘а для сдвига от МСК. Т.о. (GMT +3:00) Москва, Санкт-Петербург, Волгоград у нас будет иметь значение 0, а всё остальное плюс-минус от этого значения. Переменная $dk_timezone содержит текущий сдвиг, что позвлояет выделить нужный option. Полученный результат надо облечь в select элемент.

Да, я знаю, что построил массив излишне (можно было только указать -15 вначале, но так нагляднее и интересней выглядит.

При поиске готового архивчика с таким зонами я часто натыкался на ссылку http://www.iana.org/time-zones, где якобы представлна вся инфо по теме.

На этом уважаемом сайте действитльено даётся свободная скачка трёх интресных файликов:
Latest version
2016j (Released 2016-11-23)
File Description
tzdb-2016j.tar.lz (380.4kb) Complete Distribution (Data, Code and Extras)
tzdata2016j.tar.gz (313.7kb) Data Only Distribution
tzcode2016j.tar.gz (203.8kb) Code Only Distribution

Заметьте, что два файлика имеют расширение tar.gz, и один, самый интересный, за каким-то лешим имеет расширение .tar.lz. я не знаю, что творится в голове администратора данного ресурса, но выглядит это забавно. Что стукнуло ему в голову самый нужный файлик облечь в расширение .tar.lz, вместо доброго старого .tar.gz или на худой конец такого же доброго и такого же старого и проверенного временем tar.bz2?

Я сейчас пока вишу в Виньде (Windows 10), для распаковки пользуюсь 7zip (http://www.7-zip.org/) – огромная благодарность Игорю Павлову со-товарищи за разработку столь замечательного продукта. tar.gz и tar.bz2 (как и многие другие архивы) он щёлкает как семечки, а вот об tar.lz (по крайней мере на текущий момент, что я сейчас пишу) обламывает свои острые мощные зубки:

7zip fails to open tar.lz archive

Я даже проапгрейдил свой 7zip до версии 16.04, топовой на сегодня – 2016-11-23, т.е. 23 ноября 2016 РХ.

Быстрый гугл вывел на зверя lzip, я где-то нарыл скомпиленную под винду версию – lzip.exe, быстро запустил его в терминале,и вот что он выдаёт, собака:


С:\>lzip -d tzdb.tar.lz
tzdb.tar.lz: file ends unexpectedly at pos 21
lzip: Deleting output file `tzdb.tar', if it exists.
lzip: WARNING: deletion of output file (apparently) failed.

Я перименовал яновский tzdb-2016j.tar.lz в tzdb.tar.lz

Итак, что же делать? Далее гуглим и находим такую страничку: http://mm.icann.org/pipermail/tz/2016-September/024112.html

Вкратце, там человек по имени Oscar van Vlijmen жалуется, что не может открыть файлик lz в windows, такой же бедолага как и я, и упоминает тот же lzip, который я только что описал чуть выше.

Зачем, зачем, зачем админы http://www.iana.org/time-zones запаковали lzip‘ом только один файлик, а не все три тогда уж? Что у них, повторяюсь в третий раз, в головах творится?

Итак, кто-то ему отвечает:

Q: Why did the tachyon cross the road?
A: Because it was on the other side.

К чему это? Сколько лет ответившему так? он считает себя самым умным или самым остроумным? нет слов.

Следующий чуть лучше отвечает Оскару:

> do we get a decent application program with a graphical user interface
You mean, like the other tools we’re using? Like ‘tar’, ‘make’, and ‘cc’? 🙂

С одной стороны он прав,а с другой нет. Если ты выкладываешь файл для всего мира на скачку без явного уклона в одну систему, сделай его максимально доступным для мира, хотя бы для наиболее распространенных систем.

Ладно, этот же человек подсказал, что в CygWin‘е есть lzip, сейас его попробую, он скачивает кучу зависимостей за собой, что обычно для Unix-way. Спасибо ему, всё же он не так плох, как я думал вначале. 🙂 шутка

О, урра, получилось!!

Итак, по шагам, как я распаковал tzdb-2016j.tar.lz с сайта http://www.iana.org/time-zones в Windows 10:

1. Инсталлируем CygWin (https://cygwin.com/install.html), я это сделал в папку E:\cygwin64 – скачиваем setup-x86_64.exe файлик, запускаем его, выбираем папки (e:\cygwin64 для самого Cygwin‘а и e:\cygwin64\_local\ для временных локальных фалов.

2. Далее ищем в фильтре lzip, выбираем пакеты (я выбрал оба пакета, хотя боюсь можно выбрать только сам lzip), нажимаем Next или Далее, он выдаст окошко с зависимостями, которые по умолчанию все выбраны, нажимаем ОК, далее или что там ещё, не помню, и минут через 5 инсталлятор закончит работу.

3. Кидаем в папку e:\cygwin64\home\ВашеИмя\ нужный архивчик (tzdb-2016j.tar.lz)

4. Запускаем e:\cygwin64\Cygwin.bat, делаем ls, чтобы убедиться, что он тут:

$ ls
tzdb-2016j.tar.lz

И даём команду на его распаковку в tar:


$ lzip -d tzdb-2016j.tar.lz

На экран ничего не вывелось, кроме нового приглашения, что для Линукса говорит о том, что всё прошло ОК (хотя это не всегда так есть), т.к. если бы была какая-то ошибка, нам бы об этом с радостью сообщили.

Смотрим ещё ls:

$ ls
tzdb-2016j.tar

7zip fails to open tar.lz archive

О, у нас появился tar архивчик. Пробуем открыть его уже штатными виндовыми методами, через 7zip, и он отлично открывается, показывая список файлов.

Всё, задача решена, можно пойти выпить чая или какао или на худой конец коньяка с кофе. Или кофе без коньяка, до НГ, точнее до 12:00 31 декабря 2016 года я спиртного не потребляю, печень берегу и голову.

На сим кланяюсь. Доброй ночи!

P.S. Да, в итоге, в этом архивчике много всего интересного, но то, что мне нужно – список часовых поясов со сдвигом GMT+- для простого пользователя не оказалось!

Потом я в архиве какого-то форума нашёл приведенный выше (в самом начале поста) список, быстро переделал его под PHP, убрал +-30 минут кое-где, т.к. они мне не были нужны. И так получилась функция getOptTimeZones.