Linux 命令用于检查这一天是夏令时更改日还是朝哪个方向?

Linux 命令用于检查这一天是夏令时更改日还是朝哪个方向?

我目前正在设计一个解决方案来同步设备上的时钟。每次设备在断电后打开时,其时钟都正好是“01:01”。为了同步此设备,我有一个 NEXA 远程开关和一个 Telldus duo。 Telldus duo 连接到一个服务器,该服务器是带有 GPS 和 PPS 源的 NTP 服务器。

现在来谈谈问题:目前,时钟同步只需关闭预定于 01:00 的电源,然后在 01:01 打开电源,从而导致设备上的时钟始终正确。

但问题出在夏令时变更日。如果夏令时变更日规定时钟应在 02:00 至 03:00 之间向前移动 1 小时,则设备上的时钟将在整整一天内落后 1 小时。如果夏令时变更日规定时钟应向后移动 1 小时,则设备将运行快 1 小时。

因此,在夏令时提前日,我需要安排设备在 00:00 关闭并在 00:01 开启。然后当时钟为 00:01 时,设备将为 01:01。当时钟为 02:00 并更改为 03:00 时,设备将已经为 03:00,因此设备将只有 2 小时的错误时钟。

在夏令时倒退日,我需要安排设备在 02:00 关闭并在 02:01 开启。因此,当时钟为 03:00 时,设备将为 02:00,并且夏令时将倒退至 02:00,因此在这种情况下,设备的时钟只会错误 1 ​​小时。


我完全有能力编写一个脚本来实现这一点,因为:

我知道一个命令,它可以告诉我今天是否是发生 DST 变化的日子,以及它将在哪个方向发生(02:00 到 03:00,还是 03:00 到 02:00)。

这意味着我需要一些专用的 DST 命令,或者可以“展望未来”,例如“考虑到 DST,从现在起 4 小时后的时钟是多少?”。(然后我可以检查,如果现在和返回的时钟之间的差异是 3 小时,那么它是 DST-BACK 日,4 小时,那么它是 NO-DST 日,5 小时,那么它是 DST-FORWARD 日)

有人知道这样的命令吗?

答案1

尝试:

$ zdump -v Europe/London  -c $(date '+%Y'),$(date -d '+1 year' '+%Y') | awk -v y=$(date '+%Y') '$6==y && $15~1 {print $4, $3, $6}'
30 Mar 2014
26 Oct 2014

打印 DST 更改的日期。更改Europe/London为您的时区。

或者,稍微长一点:

$ zdump -v Europe/London  -c $(date '+%Y'),$(date -d '+1 year' '+%Y') | awk -v y=$(date '+%Y') '
                                     ($6==y && dst=="") {dst=$15}
                                     ($6==y && dst==$15) {ftime=$12; dst=$15;}
                                     ($6==y && dst!=$15) {print ftime, "to", $12, "on", $4, $3, $6, $15; dst=$15}'
00:59:59 to 02:00:00 on 30 Mar 2014 isdst=1
01:59:59 to 01:00:00 on 26 Oct 2014 isdst=0

这也打印了时间变化。最后一列显示您是否正在进入 DST(1表示正在进入 DST)。

答案2

如果有人通过 Google 来这里寻找一个简单的 Linux 终端夏令时检测命令,那么这个就足够了。然而,这对于 OP 的问题来说还不够复杂。

if perl -e 'exit ((localtime)[8])' ; then
    echo no DST
else
    echo DST
fi

*perl 中 localtime 输出的第 8 个元素是 $isdsthttp://perldoc.perl.org/functions/localtime.html

答案3

我只想问系统如何打印出 24 小时内的时间:

now=$(date +%H)
then=$(date -d '24 hours' +%H)
dst_change=$(( then - now ))

注意,不要在整点时运行此操作......

相关内容