Как создать свою собственную таблицу перехода на летнее время в среде Linux?

Я работаю над встроенным проектом 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?

Почему бы не импортировать данные из файлов zoneinfo?

Llama 29.05.2018 13:57

Зачем это вообще? Файлы база данных tz регулярно обновляются и распространяются автоматически. Фактически они находятся стандарт де-факто. Что бы ни вводил конечный пользователь, он, вероятно, получит из копию этих файлов.

Panagiotis Kanavos 29.05.2018 14:00

См. Следующую публикацию. Первая дата Unix - 01.01.1970, а net - 1/1/1: stackoverflow.com/questions/249760/…

jdweng 29.05.2018 14:01

Если у вас есть проблема, исправьте конфигурацию NTP или Обновить в файлах tzdata. Не пытайтесь скрыть проблему

Panagiotis Kanavos 29.05.2018 14:02

Я могу импортировать данные из файла zoneinfo с помощью .NET-метода localZone.GetDaylightChanges (currentYear). Но я думаю, что не могу редактировать и сохранять его динамически. Могу я ?

Guilherme Ramalho 29.05.2018 14:03

Зачем это вообще? Он автоматически обновляется sudo apt-get upgrade. Конечные пользователи узнают об изменениях после люди, которые администрируют базу данных tz.

Panagiotis Kanavos 29.05.2018 14:08

Если вы не собираетесь регулярно обновляться, вы можете использовать библиотеку, которая может работать с вашими собственными файлами tzdatabase, например NodaTime.

Panagiotis Kanavos 29.05.2018 14:10

Я согласен с вами @PanagiotisKanavos, но этот пользователь вводит таблицу обязательно для этого проекта.

Guilherme Ramalho 29.05.2018 14:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
1 072
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете написать ваша собственная замена 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 символической ссылкой на доступный для записи каталог.

Другие вопросы по теме