Linux下时区问题——CST以及GMT
基本概念
一、时区
-
UTC:(Universal Time/Temps Cordonné 世界标准时间)
-
CMT: (Greenwich Mean Time)格林尼治时间,基本上等于UTC 时间
-
CET:(Central European Time) 欧洲中部时间, 冬季时间为UTC+1, 夏季时间为UTC+2
-
CST: 可同时代表4个时区
Central Standard Time (USA) UT-6:00 Central Standard Time (Australia) UT 9:30 China Standard Time UT 8:00 Cuba Standard Time UT-4:00
二、“系统时间”与“硬件时间”
系统时间: 一般说来就是我们执行 date 命令看到的时间,linux系统下所有的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间: 主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
1、系统时间
Liunx系统中两种时间: 一种是UTC, 另一种是本地时间,两者区别为时区不同。
查看本地时间:
date
查看UTC时间
date -u
查看时区时间
date -R
GMT和CST的转化
转化成GMT
cp /usr/share/zoneinfo/GMT /etc/localtime
将时间转化为CST
echo “Asia/shanghai” > /etc/timezone
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
2、硬件时间
系统关闭时会同步系统时间到硬件时钟,系统启动时会从硬件时钟读取时间更新到系统。
若当前系统时间为CST(如+8),同步到硬件时钟后,下次系统启动时会跟根据时区再转化成(再+8)本地时间,会造成跟之前同步用的CST时间有额外的时区时间差;在以后的编程中为了避免错误,还是不要使用CST时间,而尽量采用GMT/UTC时间。
hwclock --utc
hwclock --localtime
hwclock -w #Set hardware clock from system time
如下为设置linux时间参考代码,主要应用于GPS、北斗或者上位机同步时间源。
//将00-99的整数存放成1个字节的BCD
unsigned char UcharToBCD(unsigned char data)
{
unsigned char b, bcd;
bcd = 0;
b = data / 10;
b = b << 4;
bcd |= b;
b = data % 10;
bcd |= b;
return bcd;
}
//功能:利用BCD时间设置Linux时间
//参数:
// bcdtime, 6字节当前bcd时间
//返回:
// true: 成功
// false: 失败
bool C_set_linux_time(unsigned char *bcdtime)
{
struct timeval linux_time;
struct tm sys_time;
time_t t;
struct timeval stime;
struct timezone tz;
memset(&sys_time, 0, sizeof(tm));
sys_time.tm_year = BCDToUchar(bcdtime[0]) + 2000 -1900;
sys_time.tm_mon = BCDToUchar(bcdtime[1]) - 1;
sys_time.tm_mday = BCDToUchar(bcdtime[2]);
sys_time.tm_hour = BCDToUchar(bcdtime[3]);
sys_time.tm_min = BCDToUchar(bcdtime[4]);
sys_time.tm_sec = BCDToUchar(bcdtime[5]);
t = mktime(&sys_time);
if(gettimeofday(&stime,&tz) == 0)
{
linux_time.tv_usec = 0;
linux_time.tv_sec = t;
if (settimeofday(&linux_time, &tz) == -1)
{
return false;
}
else
{
return true;
}
}
return false;
}
- 参考文献:
[1]: https://blog.csdn.net/jhc23/article/details/80987727
[2]: http://abcdxyzk.github.io/blog/2016/01/06/system-base-time/