Я работаю над встроенным проектом Linux, созданным с помощью инструмента buildroot, и я использую моно для запуска моего приложения .net в системе Linux. Необходима настраиваемая таблица периодов летнего времени. Пользователь будет вручную вставлять периоды следующих нескольких лет (когда начинается и когда заканчивается летнее время) в графический интерфейс, который я сделал в .net, и пользователю разрешается редактировать эти периоды, если они изменяются правительством. Я знаю, что, возможно, есть другой способ сделать это автоматически, но, как я уже сказал, необходимо иметь пользовательский интерфейс, чтобы устанавливать или редактировать его вручную.
Раньше я использовал этот файл в качестве информации о зоне:
/usr/share/zoneinfo/America/Sao_Paulo
В этом файле указаны периоды летнего времени Сан-Паулу, а Linux автоматически меняет системные часы при запуске, но я обнаружил, что не могу редактировать этот файл, поэтому он не работает для меня. Итак, я изменился на:
/usr/share/zoneinfo/Etc/GMT+3
В этом файле есть информация о зоне без периодов перехода на летнее время. Планирую сделать это вручную.
Я сделал графический интерфейс, который сохраняет таблицу настраиваемых периодов летнего времени в базе данных mongodb. Моя идея заключалась в том, чтобы установить системные часы Linux на один час, когда я обнаруживаю, что текущее время находится в пределах любого периода, сохраненного в моей базе данных. Он также работал очень хорошо, но проблема в том, что моя служба NTP синхронизирует и обновляет системные часы, снова устанавливая их на один час назад. И, конечно же, я не могу отключить службу NTP, мне это тоже нужно.
Как я могу реализовать эту функцию? Лучше реализовать это в Linux для выполнения этой задачи или в моем приложении .net, работающем в Linux?
Зачем это вообще? Файлы база данных tz регулярно обновляются и распространяются автоматически. Фактически они находятся стандарт де-факто. Что бы ни вводил конечный пользователь, он, вероятно, получит из копию этих файлов.
См. Следующую публикацию. Первая дата Unix - 01.01.1970, а net - 1/1/1: stackoverflow.com/questions/249760/…
Если у вас есть проблема, исправьте конфигурацию NTP или Обновить в файлах tzdata. Не пытайтесь скрыть проблему
Я могу импортировать данные из файла zoneinfo с помощью .NET-метода localZone.GetDaylightChanges (currentYear). Но я думаю, что не могу редактировать и сохранять его динамически. Могу я ?
Зачем это вообще? Он автоматически обновляется sudo apt-get upgrade. Конечные пользователи узнают об изменениях после люди, которые администрируют базу данных tz.
Если вы не собираетесь регулярно обновляться, вы можете использовать библиотеку, которая может работать с вашими собственными файлами tzdatabase, например NodaTime.
Я согласен с вами @PanagiotisKanavos, но этот пользователь вводит таблицу обязательно для этого проекта.





Вы можете написать ваша собственная замена localtime () или использовать инструмент zic.
Но прежде всего: вы, вероятно, не захотите этого делать. Цитата @Panagiotis:
The tz database files are updated regularly and distributed automatically. In fact they are the defacto standard.
Фактически, «регулярно обновляется» в основном для исторической информации о часовых поясах, потому что часовые пояса просто не так часто меняются. В Buildroot просто установите пакет tzdata, и у вас будут все часовые пояса мира.
Чтобы применить информацию о часовом поясе, вы всегда должны делать это как можно позже. Системные часы должен находятся в UTC. Отметки времени в файлах также должны быть в формате UTC. Современные системные регистраторы (например, systemd-journald) также хранят временные метки в формате 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 символической ссылкой на доступный для записи каталог.
Почему бы не импортировать данные из файлов zoneinfo?