![正确使用 TZ、日期和 hwclock?](https://linux22.com/image/30884/%E6%AD%A3%E7%A1%AE%E4%BD%BF%E7%94%A8%20TZ%E3%80%81%E6%97%A5%E6%9C%9F%E5%92%8C%20hwclock%EF%BC%9F.png)
我正在为定制板开发 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
使用原子表命令设置系统时钟,因为断电后计算机时间会漂移