//修改时区 //f删除现有的目标文件 //s 做象征性的链接,而不是硬链接
# date -s ‘2016-12-14 11:45:00’ //设置时间
# clock -w //将时间写入CMOS
# cat /etc/sysconfig/clock //查看所属时区和是否使用UTC时间
备注: 时区需要修改 并且 需要修改CMOS
然后只是用date -s 修改时间的话重启系统后时间会还原
RTC时间 *** 作:
1.rtc时间是由rtc硬件控制的,所以在linux中想要修改和获取rtc时间就只能通过驱动的接口来获取和修改。
intrtc_test(void)
{
structrtc_timertc
intfd=-1
intret=-1
fd=open("/dev/rtc0",O_RDWR)
if(fd<0){
return-1
}
ret=ioctl(fd,RTC_RD_TIME,&rtc)
if(ret<0){
return-1
}
printf("\nCurrentRTCdata/timeis%d-%d-%d,%02d:%02d:%02d.\n",rtc.tm_mday,rtc.tm_mon+1,
rtc.tm_year+1900,rtc.tm_hour,rtc.tm_min,rtc.tm_sec)
ret=ioctl(fd,RTC_SET_TIME,&rtc)
if(ret<0){
return-1
}
return0
}
2.除了上面这种方式 *** 作rtc时间以外,linux中也有一个命令可以简化rtc时间 *** 作,hwclock,比如,可以通过system("hwclock-w")系统调用来把xtime设置到rtc硬件。
墙上时间(realtime、xtime):
linux系统中主要使用的就是xtime,它是系统运行的基础,很多程序都是依赖于xtime来运行的,接下来将介绍将如何 *** 作xtime。
1.获取、设置微秒级别的时间:
#include
#include
structtimeval
{
inttv_sec
inttv_usec
}
intgettimeofday(structtimeval*tv,structtimezone*tz)
intsettimeofday(conststructtimeval*tv,conststructtimezone*gz)
功能描述:
gettimeofday()获取当前时间,有tv指向的结构体返回。
settimeofday()把当前时间设成由tv指向的结构体数据。当前地区信息则设成tz指向的结构体数据。
2.获取秒级别的时间
typedeflongtime_t
time_ttime(time_t*t)
如果t是non-null,它将会把时间值填入t中
3.内核2.6版本后新增的clockapi接口
获取纳秒级别的时间
structtimespec{
time_ttv_sec/*秒s*/
longtv_nsec/*纳秒ns*/
}
intclock_getres(clockid_tclk_id,structtimespec*res)
intclock_gettime(clockid_tclk_id,structtimespec*tp)
intclock_settime(clockid_tclk_id、conststructtimespec*tp)
编译连接时采用-lrt才能编译通过。
clk_id可选参数:
CLOCK_REALTIME
系统全局的实时时钟.设置此时钟需要合适的权限.
CLOCK_MONOTONIC
只能被读取,无法被设置,表示monotonic时间起点.
CLOCK_PROCESS_CPUTIME_ID
从cpu每进程的高分辨率计时器.
CLOCK_THREAD_CPUTIME_ID
线程的特定cpu时间时钟.
系统启动时,会首先从rtc中读取rtc时间,并设置给xtime,而当ntp对系统时间进行更新时,首先设置xtime,然后调用hwclock设置到rtc硬件中。xtime根据需要的精度,可以通过上面几个接口来选择使用。
一、首先要弄清几个概念:1. “系统时间”与“硬件时间”
系统时间: 一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
2. “UTC时间”与“本地时间”
UTC时间:Coordinated Universal 8 e2 i( H7 t0 ^/ ^Time 世界协调时间(又称世界标准时间、世界统一时间),在一般精度要求下,它与GMT(Greenwich Mean Time,格林威治标准时间)是一样的,其实也就是说 GMT≈UTC,但 UTC 是以原子钟校准的,更精确。
本地时间:由于处在不同的时区,本地时间一般与UTC是不同的,换算方法就是
本地时间 = UTC + 时区 或 UTC = 本地时间 - 时区
时区东为正,西为负,例如在中国,本地时间都使用北京时间,在linux上显示就是 CST(China Standard Time,中国标准时,注意美国的中部标准时Central Standard Time也缩写为CST,与这里的CST不是一回事!),时区为东八区,也就是 +8 区,所以 CST=UTC+(+8小时) 或 UTC=CST-(+8小时)。
二、设置硬件时钟 UTC
硬件时间 /sbin/hwclock
直接调用 /sbin/hwclock 显示的时间就是 BIOS 中的时间吗?未必!这要看 /etc/sysconfig/clock 中是否启用了UTC,如果启用了UTC(UTC=true),显示的其实是经过时区换算的时间而不是BIOS中真正的时间,如果加上 --localtime 选项,则得到的总是 BIOS 中实际的时间.
[12-01 19:07>~]# hwclock
2009年12月07日 星期一 14时28分43秒 -0.611463 seconds
[12-01 19:07>~]# hwclock --utc
2009年12月07日 星期一 14时28分46秒 -0.594189 seconds
[12-01 19:07>~]# hwclock --localtime
2009年12月07日 星期一 06时28分50秒 -0.063875 seconds
三、最后总结
1)/etc/sysconfig/clock 文件,只对 hwclock 命令有效,且只在系统启动和关闭的时候才有用(修改了其中的 UTC=true 到 UTC=false 的前后,执行 hwclock (--utc, 或 --localtime) 都没有变化,要重启系统后才生效);
2)/etc/rc.d/rc.sysinit 文件,run once at boot time,其中有从硬件时钟同步时间到系统时间的 *** 作;
3)hwclock --localtime 的输出,才是硬件时钟真正的时间。如果输出结果带时区(比如CST),还要看/etc/sysconfig/clock里的UTC参数,如果 UTC=false,那时区有意义;如果 UTC=true,那时区没意义,实际上是UTC时间。
4)在 /etc/sysconfig/clock 中 UTC=false 时,date、hwclock、hwclcok --localtime 输出的时间应该都一致,且此时 hwclock --utc是没有意义的;
5)在 /etc/sysconfig/clock 中 UTC=ture 时,date、hwclock 的输出是一致的,hwclock --localtime 的输出则是UTC时间;
6)如果不想在输出中带时区,则 export LANG=C ,然后再运行 hwclock 就没有什么CST了,免得时区误导你;
7)hwclock --utc 容易理解出错
8)系统关闭时会同步系统时间到硬件时钟,系统启动时会从硬件时钟读取时间更新到系统,这2个步骤都要根据 /etc/sysconfig/clock 文件中UTC的参数来设置时区转换。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)