正确使用 TZ、日期和 hwclock?

正确使用 TZ、日期和 hwclock?

我正在为定制板开发 Buildroot 开发的 ARM/ulibc Linux 发行版。我试图理解之间的关系

如果我这样做,正如我在网上看到的一些例子:

# date --set "2013-04-09 15:06:30"
Tue Apr  9 15:06:30 CDT 2013
# hwclock --systohc --utc
# hwclock
Tue Apr  9 15:06:39 2013  -0.351552 seconds

并重新启动,我得到:

.... boot messages ...
... setting system clock to 2013-04-09 20:07:31 UTC (1365538051)
.... boot messages ...
#
# date; hwclock;
Tue Apr  9 15:08:24 CDT 2013
Tue Apr  9 15:08:25 2013  -0.473164 seconds
#
# date -u; hwclock -u;
Tue Apr  9 20:08:44 UTC 2013
Tue Apr  9 15:08:45 2013  -0.397120 seconds
#
# date; hwclock --localtime
Tue Apr  9 15:09:07 CDT 2013
Tue Apr  9 20:09:08 2013  -0.686601 seconds
#

所以,hwclock 似乎认为当地时间世界标准时间?由于某种原因,当-u实际应用它时适用时区而不是?我有点困惑。谁能建议我应该如何处理这个问题?

编辑: 我应该注意到,作为一个 ARM + Busybox + uclibc 的精简系统,我没有很多典型的目录和文件,比如 sysconfig 和 zoneinfo。

答案1

--utc指示hwclock硬件时钟保持 UTC,并--localtime指示硬件时钟保持与系统时钟相同的时区。 (更准确地说,它表示硬件时钟与系统时钟当前保持相同的 UTC 偏移量 - 硬件时钟通常不知道 DST 是否处于活动状态。)这些选项与系统时钟的时区无关。

从理论上讲,这会告诉您需要知道的一切。在实践中,这可能会令人困惑。

# date -u; hwclock -u;
Tue Apr  9 20:08:44 UTC 2013
Tue Apr  9 15:08:45 2013  -0.397120 seconds

“首先,告诉我 UTC 系统时间。那么,假设硬件时钟保持 UTC,那么本地时区的时间是多少?”

# date; hwclock --localtime
Tue Apr  9 15:09:07 CDT 2013
Tue Apr  9 20:09:08 2013  -0.686601 seconds

“首先,告诉我本地时区的系统时间。那么,假设硬件时钟保持本地时间,那么本地时区的时间是多少?”

在大多数系统上,您可以设置TZ环境变量来设置进程的时区。这是一个 POSIX 功能。 BusyBox 支持这一点(我没有看到在编译时关闭它的选项),我相信 uClibc 也是如此。当进行时钟同步时,它可以帮助在短时间内以 UTC 操作所有内容:

export TZ=UTC0
date
hwclock

答案2

我使用以下命令设置时间信息:

# setup local timezone
rm /etc/localtime
# setup for EDT and EST (+4 EDT; +5 EST)
ln -s /usr/share/zoneinfo/EST5EDT /etc/localtime
# setup for only EST (+5 EST)
#ln -s /usr/share/zoneinfo/EST /etc/localtime
# setup for only Daylight Saving Time
#ln -s /usr/share/zoneinfo/EDT /etc/localtime

rm /etc/timezone
echo "US/Eastern" > /etc/timezone
export TZ="/usr/share/zoneinfo/America/New_York"

注意:此脚本运行后date -u MMDDhhmm使用原子表命令设置系统时钟,因为断电后计算机时间会漂移

相关内容