2014-12-09 3 views
5

У нас есть встроенная система Linux, в которой пользователь может установить часовой пояс из списка tzfile системы (так что имена стран/мест, GMT + -n, UTC) или часовой пояс/$ TZ могут быть напрямую устанавливается в формате POSIX (EG CET-01:00:00CEST-02:00:00,M3.5.0/02:00:00,M10.5.0/03:00:00 или EST5EDT) удаленным сервером (который не знает названия часового пояса).Файл временной зоны для строки времени POSIX

Независимо от того, какой объект привязал последний часовой пояс (будь то человеческий или удаленный сервер), нам необходимо сообщить о настройке локального часового пояса на удаленный сервер в формате POSIX, желательно с минимальной ложью/подтасовкой.

Перед тем, как свернуть рукава, надеть мою заостренную шляпу и начать с рук вручную разобрать формат tzfile. Я подумал, что стоит спросить, есть ли уже существовавшая функция/библиотека или пример этого?

Я проехал через стандартные библиотеки и не вижу ничего, что делает это специально.

ответ

5

Под «tzfile» - вы имеете в виду часовые пояса IANA tz database, - как правило, в наши дни на компьютерах установлены часовые пояса. Например, America/Los_Angeles или Europe/London.

Эти часовые пояса намного богаче, чем возможно, с часовыми поясами POSIX - так как они содержат информацию о времени времени в этом месте. Временные зоны POSIX могут хранить только текущие правила часовых поясов, поэтому они не могут точно представлять время в реальном мире, где часто изменяются правила часовых поясов.

См. Также раздел о часовых поясах POSIX в the timezone tag wiki.

Сказанное - если вы должны использовать часовые пояса POSIX, вы можете посмотреть на date_time module in Boost. Boost имеет it's own data file, который основан на часовых поясах IANA. Это описано в разделе "Time Zone Database" in the docs. После загрузки зоны вы можете использовать to_posix_string, чтобы получить нужное значение.

Например:

tz_database tz_db; 
tz_db.load_from_file("./date_time_zonespec.csv"); 
time_zone_ptr nyc = tz_db.time_zone_from_region("America/New_York"); 
nyc->to_posix_string(); // "EST-05EDT+01,M4.1.0/02:00,M10.5.0/02:00" 

Имейте в виду, что база данных часового пояса IANA обновляется около дюжины раз в год, и это выглядит как подталкивания не обновлял это CSV-файл с апреля Я не уверен, что их процесс для поддержания файла - но я бы догадался, что он сломан.

+0

Да, это то, о чем я говорю, мой _question_ относится к удовлетворению системы, которая должна иметь текущий параметр часового пояса в формате POSIX, независимо от того, насколько Плохо/Неверно/глупо, что может быть для передового мышления, просвещенного правоподобного бедрами и челками по тренду. –

+0

Я обновил свой ответ с дополнительной информацией. Но, пожалуйста, постарайтесь сохранить его гражданским. Я просто предлагаю руководство. Зоны POSIX по своей сути являются плохими. Если вы можете обновить свою систему, чтобы использовать обычный tzdb, это будет намного лучше. AFAIK, все Linux-системы поддерживают tzdb - даже если они по умолчанию не установлены. (Да - даже встроенные системы) –

+0

Благодарим за обновление, это, безусловно, более конструктивно - должным образом нераспределенным и поддержанным. У нас есть проблема, что для того, чтобы наша система прошла важную отраслевую сертификацию, она ДОЛЖНА позволить удаленной автоматизированной тестовой системе получать/устанавливать временные интервалы в формате POSIX. Конечно, строки POSIX tz ничего не значат для среднего _user_, поэтому мы представляем дружественный список имен стиля tzfile в нашем пользовательском интерфейсе, поэтому необходимо перевести из правого стиля tzfile в POSIX для прохождения теста. –

Смежные вопросы