Страница 2 из 3
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 10:49
tma
ddkprog писал(а):
случаи парсинга case 'Z': и case 'z':
О, хорошая ссылка. Linux не поддерживает.
Хотя в имеющемся исходнике от NetBSD данная опция так же неподдерживается!
Код: Выделить всё
/* Operations with locale and time zones not supported. */
case 'Z': /* Time-zone-related. */
case 'z':
Правда мой датирован 2008,а этот - 2009.
ddkprog писал(а):
ни в одном нет такого понятия как MSK, это надуманый формат зоны и не стандартный
MSK это стандартное название. Вот
ссылка,кстати данные по ней устарели -- они не знаю про медведевский указ.
ddkprog писал(а):
поэтому пороще масивчик для соответсвия составить что MSK это Europe/Moscow итд
Крупный массивчик получается. ;(
Да и сам список сформировать как-то нужно.
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 17:18
tma
Europe/Moscow тоже в стандарте нет, а его понимает tzset в переменной TZ, т.к. туда можно вносить путь (в том числе относительный) к zoneinfo.
zoneinfo так же не содержит никаких MSK/MSD (файлы zone.tab и iso3166.tab).
Парсить все бинарные файлы зон не будешь -- для этого придется сканировать каталог в поисках нужного файла, затем его загружать и искать там аббревиатуру.
Есть вариант написать свой парсер исходной базы tzdata2011h.tar.gz (и т.д.), но смысл, когда она уже есть в zoneinfo?
Кстати, что-то не могу сообразить. +0300 это плюс к UTC или минус? Мозги вообще уже не варят...
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 17:50
tma
Linux'овый date как-то работает:
Код: Выделить всё
$ env TZ=UTC date -d "17:35:17.454 MSK Mon Nov 7 2011" +"%s %c"
1320676517 Пнд 07 Ноя 2011 14:35:17
Полез в исходники пакета coreutils...
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 19:59
tma
Блин, оказывается в date жестко забиты все таймзоны!
Код: Выделить всё
static table const time_zone_table[] =
{
...
{ "MSK", tZONE, HOUR ( 3) }, /* Moscow */
{ "MSD", tDAYZONE, HOUR ( 3) }, /* Moscow Daylight */
...
{ NULL, 0, 0 }
};
Выходит при изменении московского часового пояса, нужно так же проапгрейдить и данные утилиты... Дамс.
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 20:05
ded
Блин, таки оказалос, что не елементарная задачка?
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 20:27
tma
ddkprog писал(а):
и одного файла соотвествий нет, есть кучу файлов разных зон где есть ети абревеатуры
Есть в текстовом формате - типа tzdata2011h.tar.gz.
Пример:
Код: Выделить всё
Zone Europe/Moscow 2:30:20 - LMT 1880
2:30 - MMT 1916 Jul 3 # Moscow Mean Time
2:30:48 Russia %s 1919 Jul 1 2:00
3:00 Russia MSK/MSD 1922 Oct
2:00 - EET 1930 Jun 21
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
2:00 Russia EE%sT 1992 Jan 19 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK
ddkprog писал(а):
поэтому универсальное - парсить каталог на наличие всех файлов зон
У меня пока мысль стандартным парсером попробовать сформировать один большой файл таймзоны по всему миру,
а затем скормить его библиотечной функции tzfile.
ddkprog писал(а):
но колупатся во всех glib и прочих мне лень) у tma еще все впереди
Да, блин. Голова уже кипит.
ddkprog писал(а):
а вообще проще устанавливать строгость в тайм выводах
и выводить тайм зон только в iso стандартах, GMT+3 или +3.00
другие выводы уже не стандарт
Сейчас я позвоню в Cisco и скажу, чтобы время выводили только в UTC. Кто даст номер телефона?

Кстати GMT давным давно не используется, а используется именно UTC.
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 20:28
tma
ded писал(а):что не елементарная задачка?
Да куда там. Кто в лес кто по дрова...
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 20:51
ded
tma писал(а):Сейчас я позвоню в Cisco и скажу, чтобы время выводили только в UTC. Кто даст номер телефона?

80020935011 (обрати внимание - международный 800-й, а не российский! То есть из России звонить как по межгороду, 8-10-80020935011
Контакт: Юлия Лубенская
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 20:54
tma
Вытащить из zoneinfo все соответствия таймзон и аббревиатур можно так:
Код: Выделить всё
$ for zi in `find /usr/share/zoneinfo`; do zdump $zi | sed -e 's|/usr/share/zoneinfo/||g' | awk '{print $1 " " $7}'; done | uniq | grep MSK
localtime MSK
W-SU MSK
right/W-SU MSK
right/Europe/Moscow MSK
posix/W-SU MSK
posix/Europe/Moscow MSK
Europe/Moscow MSK
Осталось отфильтровать ненужные.
Думаю можно и на awk сразу написать такое, но я его плохо знаю для этого...
Re: Элементарная задачка для программиста
Добавлено: 07 ноя 2011, 22:54
gosha
эхх, не понять 'чудакам' пушущим на языках на букву 'P', 'реальных патцанов' на C...
gosha@g-laptop:/tmp$ cat /tmp/2 | perl -e 'use Date::Parse; print scalar(localtime(str2time($_))),"\n" while <>'
Wed Dec 9 21:27:28 1998
Sat Nov 5 22:04:33 2011
Sat Nov 5 22:04:33 2011
gosha@g-laptop:/tmp$ cat /tmp/2
18:27:28.032 UTC Wed Dec 9 1998
21:04:33.433 MSK Sat Nov 05 2011
21:04:33.433 +0300 Sat Nov 05 2011