Как создать свой собственный график перехода на летнее время в среде Linux? - PullRequest
0 голосов
/ 29 мая 2018

Я работаю над встроенным проектом linux, созданным с помощью инструмента buildroot, и использую mono для запуска своего приложения .net в системе linux.Необходимо иметь собственную таблицу периодов летнего времени.Пользователь вставит вручную следующие несколько лет (когда начинается летнее время и когда оно заканчивается) в графический интерфейс, который я сделал в .net, и пользователю разрешено редактировать эти периоды, если они изменяются правительством.Я знаю, может быть, есть другой способ сделать это автоматически, но, как я уже сказал, необходимо иметь пользовательский интерфейс для установки или редактирования вручную.

Прежде чем я использовал этот файл в качестве информации о зоне:

/ usr / share / zoneinfo / America / Sao_Paulo

Этот файл имеет летнее время Сан-Паулу, и Linux автоматически меняет системные часы при запуске, но яобнаружил, что я не могу редактировать этот файл, поэтому он не работает для меня.Поэтому я изменил на:

/ usr / share / zoneinfo / Etc / GMT + 3

В этом файле есть моя zoneinfo без периодов летнего времени.Я планирую сделать это вручную.

Я сделал графический интерфейс, который сохраняет таблицу пользовательских периодов DST в базе данных mongodb.Моя идея состояла в том, чтобы установить системные часы Linux на один час, когда я обнаружу, что текущее время находится в пределах любого периода, сохраненного в моей базе данных.Он также работал очень хорошо, но проблема в том, что моя служба NTP синхронизирует и обновляет системные часы, снова устанавливая их на один час назад.И, конечно, я не могу отключить службу NTP, мне это тоже нужно.

Как я могу реализовать эту функцию?Лучше ли реализовать это в Linux для выполнения этой задачи или в моем приложении .net, работающем в Linux?

1 Ответ

0 голосов
/ 30 мая 2018

Вы можете написать собственную замену localtime () , или использовать инструмент zic .

Прежде всего, однако: вы, вероятно, нехочу сделать это.Цитирование @Panagiotis:

База данных tz регулярно обновляется и распространяется автоматически.Фактически они являются стандартом де-факто.

Фактически, «регулярно обновляемые» в основном предназначены для информации о часовых поясах за прошлый период, потому что часовые пояса просто не меняются так часто.В Buildroot просто установите пакет tzdata, и у вас есть все часовые пояса в мире.

Для применения информации о часовом поясе вы всегда хотите сделать это как можно позже.Системные часы должны быть в UTC.Отметки времени для файлов также должны быть в UTC.Современные системные регистраторы (например, systemd-journald) также хранят метки времени в UTC.Все время общение по сети должно быть в UTC.Только когда время представлено пользователю, необходимо преобразовать его в местное время (которое может быть различным для разных пользователей).

Чтобы решить вашу проблему с пользовательскими часовыми поясами, проще всего не использовать обычное время.localtime () (или любой другой эквивалент .NET), но вместо этого используйте функцию-обертку, которая сначала проверяет, является ли текущий часовой пояс одним из пользовательских часовых поясов, и в этом случае выполняет ваши собственные вычисления часового пояса.

В качестве альтернативы,Вы можете создать файл часового пояса и записать его в файловую систему.Формат tzfile является двоичным форматом, поэтому, вероятно, проще сгенерировать текстовый файл и преобразовать его с помощью инструмента zic .В Buildroot инструмент zic в данный момент недоступен для цели, поэтому вам нужно обновить package/zic/zic.mk и добавить package/zic/Config.in.Вы можете посмотреть, как Buildroot генерирует файлы часовых поясов из файла правил tzdata в package/tzdata/tzdata.mk.

Если вам действительно нужно настроить часовой пояс для всей системы (что обычно вам не нужно делать), вы должны создать символическую ссылку на пользовательский часовой пояс из /etc/localtime и установить ее в /etc/timezone.И, конечно же, вы должны убедиться, что файл пользовательского часового пояса доступен для записи.Я бы посоветовал дать вашим часовым поясам нестандартные имена, например, начиная с Custom /, и сделать /usr/share/zoneinfo/Custom символической ссылкой на доступный для записи каталог.

...