如何在Linux环境下制作自己的夏令时表?

时间:2018-05-29 11:54:17

标签: c# linux mono buildroot

我正在开发使用buildroot工具构建的linux嵌入式项目,我正在使用mono在linux系统上运行我的.net应用程序。有必要有一个夏令时的自定义表格。用户将在我在.net中完成的GUI界面中手动插入接下来几年的时间段(夏令时开始时和结束时),如果政府更改了用户,则允许用户编辑这些时段。我知道也许有其他方法可以自动完成,但就像我说的那样,有必要手动设置或编辑它。

在我使用此文件作为我的zoneinfo信息之前:

  

的/ usr / share / zoneinfo中/美/圣保罗

此文件具有圣保罗夏令时的时间段,Linux在启动时自动更改系统时钟,但我发现无法编辑此文件,因此它对我不起作用。所以我改为:

  

的/ usr / share / zoneinfo中的/ etc / GMT + 3

此文件的zoneinfo没有夏令时。我打算手动完成。

我做了GUI界面,在mongodb数据库中保存了自定义DST周期表。我的想法是当我检测到当前时间在我的数据库中保存的任何时间段内时,将Linux系统时钟设置为一小时。它也运行得很好,但问题是当我的NTP服务同步并更新系统时钟时,将其设置为后面一小时。当然,我无法禁用NTP服务,我也需要它。

如何实现此功能?在Linux中执行此任务或在Linux上运行的.net应用程序中更好地实现这一点吗?

1 个答案:

答案 0 :(得分:1)

您可以写自己替换localtime(),或者使用zic工具

然而,首先,你可能不想这样做。引用@Panagiotis:

  

tz database文件会定期更新并分发   自动。事实上,它们是事实上的标准。

事实上,"定期更新"主要用于历史时区信息,因为时区根本不会经常改变。在Buildroot中,只需安装tzdata包,即可拥有世界上所有的时区。

要应用时区信息,您总是希望尽可能晚地执行此操作。系统时钟必须为UTC。文件的时间戳也应该是UTC。现代系统记录器(例如systemd-journald)也以UTC格式存储时间戳。通过网络传送的所有时间都应该是UTC。只有当时间呈现给用户时,才有必要将其转换为本地时间(对于不同的用户可能会有所不同)。

要解决自定义时区的问题,最简单的方法是不使用普通的localtime()(或.NET等价物),而是使用首先检查当前时区是否为自定义时区之一的包装函数,并在这种情况下进行自己的时区计算。

或者,您可以生成时区文件并将其写入文件系统。 tzfile format是二进制格式,因此可能更容易生成文本文件并使用zic tool进行转换。在Buildroot中,zic工具目前无法用于目标,因此您需要更新package/zic/zic.mk并添加package/zic/Config.in。您可以查看Buildroot如何从tzdata中的package/tzdata/tzdata.mk规则文件生成时区文件。

如果您确实需要在系统范围内配置时区(您通常不需要这样做),则必须从/etc/localtime创建自定义时区的符号链接并将其设置为{ {1}}。当然,您必须确保自定义时区文件是可写的。我建议给你的时区指定非标准名称,例如:从Custom /开始,并使/etc/timezone成为可写目录的符号链接。