Linux系统中C语言如何修改时区

Linux系统中C语言如何修改时区,第1张

struct timezone {

int tz_minuteswest; / minutes west of Greenwich /

int tz_dsttime; / type of DST correction /

};

用这个试试

修改linux的时间可以使用date指令

修改日期:

时间设定成2009年5月10日的命令如下:

#date -s 05/10/2009

修改时间:

系统时间设定成上午10点18分0秒的命令如下。

#date -s 10:18:00

修改时区:

找到相应的时区文件 /usr/share/zoneinfo/Asia/Shanghai替换当前的/etc/localtime。

修改/etc/sysconfig/clock文件的内容为:

ZONE=”Asia/Shanghai”

UTC=false

ARC=false

同步bios时间:

同步BIOS时钟,强制把系统时间写入CMOS,命令如下:

#clock -w

date命令的功能是显示和设置系统日期和时间。

输入date 查看目前系统时间。

修改时间需要 date -功能字符 修改内容

命令中各选项的含义分别为:

-d datestr, --date datestr 显示由datestr描述的日期

-s datestr, --set datestr 设置datestr 描述的日期

-u, --universal 显示或设置通用时间

时间域

%H 小时(0023)

%I 小时(0112)

%k 小时(023)

%l 小时(112)

%M 分(0059)

%p 显示出AM或PM

%r 时间(hh:mm:ss AM或PM),12小时

%s 从1970年1月1日00:00:00到目前经历的秒数

%S 秒(0059)

%T 时间(24小时制)(hh:mm:ss)

%X 显示时间的格式(%H:%M:%S)

%Z 时区 日期域

%a 星期几的简称( SunSat)

%A 星期几的全称( SundaySaturday)

%b 月的简称(JanDec)

%B 月的全称(JanuaryDecember)

%c 日期和时间( Mon Nov 8 14:12:46 CST 1999)

%d 一个月的第几天(0131)

%D 日期(mm/dd/yy)

%h 和%b选项相同

%j 一年的第几天(001366)

%m 月(0112)

%w 一个星期的第几天(0代表星期天)

%W 一年的第几个星期(0053,星期一为第一天)

%x 显示日期的格式(mm/dd/yy)

%y 年的最后两个数字( 1999则是99)

%Y 年(例如:1970,1996等)

需要特别说明的是,只有超级用户才能用date命令设置时间,一般用户只能用date命令显示时间。

例1:用指定的格式显示时间。

$ date '+This date now is =>%x ,time is now =>%X ,thank you !'

This date now is =>11/12/99 ,time is now =>17:53:01,thank you !

例2:用预定的格式显示当前的时间。

# date

Fri Nov 26 15:20:18 CST 1999

例3:设置时间为下午14点36分。

# date -s 14:36:00

Fri Nov 26 14:15:00 CST 1999

例4:设置时间为1999年11月28号。

# date -s 991128

Sun Nov 28 00:00:00 CST 1999

实例:设置时间伟2008年8月8号12:00

# date -s "2008-08-08 12:00:00"

修改完后,记得输入:clock -w

把系统时间写入CMOS

使用“date -s”命令来修改系统时间

比如将系统时间设定成2007年8月1日的命令如下。

[root@localhost root]# date -s 08/01/2005

将系统时间设定成下午5点10分0秒的命令如下。

[root@localhost root]# date -s 17:10:00

这里说的是系统时间,是linux由操作系统维护的。

在系统启动时,Linux操作系统将时间从CMOS中读到系统时间变量中,以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性,Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间(大约是11分钟)进行的,在我们执行date -s后,如果马上重起机器,修改时间就有可能没有被写入CMOS,这就是问题的原因。

如果要确保修改生效可以执行如下命令。

[root@localhost root]# clock -w

或者

[root@localhost root]# hwclock

这个命令强制把系统时间写入CMOS。

Linux时钟的分类

Windows时钟大家可能十分熟悉了,Linux时钟在概念上类似Windows时钟显示当前系统时间,但在时钟分类和设置上却和Windows大相径庭。和Windows不同的是,Linux将时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟两种。系统时间是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的那个主板硬件时钟,这个时钟可以在BIOS的“Standard BIOS Feture”项中进行设置。

既然Linux有两个时钟系统,那么大家所使用的Linux默认使用哪种时钟系统呢?会不回出现两种系统时钟冲突的情况呢?这些疑问和担心不无道理。首先,Linux并没有默认哪个时钟系统。当Linux启动时,硬件时钟会去读取系统时钟的设置,然后系统时钟就会独立于硬件运作。

从Linux启动过程来看,系统时钟和硬件时钟不会发生冲突,但Linux中的所有命令(包括函数)都是采用的系统时钟设置。不仅如此,系统时钟和硬件时钟还可以采用异步方式,见图1所示,即系统时间和硬件时间可以不同。这样做的好处对于普通用户意义不大,但对于Linux网络管理员却有很大的用处。例如,要将一个很大的网络中(跨越若干时区)的服务器同步,假如位于美国纽约的Linux服务器和北京的Linux服务器,其中一台服务器无须改变硬件时钟而只需临时设置一个系统时间,如要将北京服务器上的时间设置为纽约时间,两台服务器完成文件的同步后,再与原来的时钟同步一下即可。这样系统和硬件时钟就提供了更为灵活的操作。

设置Linux的时钟

在Linux中,用于时钟查看和设置的命令主要有date、hwclock和clock。其中,clock和hwclock用法相近,只不过clock命令除了支持x86硬件体系外,还支持Alpha硬件体系。由于目前绝大多数用户使用x86硬件体系,所以可以视这两个命令为一个命令来学习。

1在虚拟终端中使用date命令来查看和设置系统时间

查看系统时钟的操作:

# date

设置系统时钟的操作:

# date 09171327200330

通用的设置格式:

# date 月日时分年秒

2使用hwclock或clock命令查看和设置硬件时钟

查看硬件时钟的操作:

# hwclock --show 或

# clock --show

2003年09月17日 星期三 13时24分11秒 -0482735 seconds

设置硬件时钟的操作:

# hwclock --set --date="09/17/2003 13:26:00"

或者

# clock --set --date="09/17/2003 13:26:00"

通用的设置格式:hwclock/clock --set --date=“月/日/年 时:分:秒”。

3同步系统时钟和硬件时钟

Linux系统(笔者使用的是Red Hat 80,其它系统没有做过实验)默认重启后,硬件时钟和系统时钟同步。如果不大方便重新启动的话(服务器通常很少重启),使用clock或hwclock命令来同步系统时钟和硬件时钟。

硬件时钟与系统时钟同步:

# hwclock --hctosys

或者

# clock --hctosys

上面命令中,--hctosys表示Hardware Clock to SYStem clock。

系统时钟和硬件时钟同步:

# hwclock --systohc

或者

# clock --systohc

cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime

apt-get install ntpdate

ntpdate cnpoolntporg

dpkg-reconfigure tzdata

主界面上显示着时区“America”的字样,然后选择Asia,再选择Shanghai,

保存之后输出如下信息:

Current default time zone: ‘Asia/Shanghai’Local time is now: Wed May 2 04:03:07 CST 2012Universal Time is now: Tue May 1 20:03:07 UTC 2012

设置时间date -s '2012/08/24'

date -s '15:22:00'

服务器时间与网络时间不符:

一、手动修改

1 date命令:查看当前时间

2 date -s 时分秒 :修改时间

还需要把日期改过来

3 date -s 完整日期时间(YYYY-MM-DD hh:mm[:ss]):修改日期、时间

时间要用双引号括起来,否则报错

手动修改会存在一定的时间误差

4 hwclock -w

将时间写入bios避免重启失效。

当我们进行完 Linux 时间的校时后,还需要以 hwclock 来更新 BIOS 的时间,因为每次重新启动的时候,系统会重新由 BIOS 将时间读出来,所以, BIOS 才是重要的时间依据呐。

二、同步网络时间

1 检查系统是否安装ntp服务

安装ntp服务命令:

apt-get install ntp 或者 yum install ntp

2 service --status-all:检查ntp服务是否启动

[+]表示服务已启动

3 ntpdate 服务器IP:同步服务器时间

ntp常用服务器:

中国国家授时中心:2107214544

NTP服务器(上海) :ntpapibz

美国:timenistgov

复旦:ntpfudaneducn

微软公司授时主机(美国) :timewindowscom

台警大授时中心(台湾):asiapoolntporg

服务器换成上海的

时间还是差一分钟,手动把时间与当前时间间隔改大一些,再同步发现有问题,服务器时间根本就不对,差了半天时间,/(ㄒoㄒ)/~~

用微软公司授时主机(美国),发现和上海的服务器时间差不多,那是不是时区设置有问题??

4 修改服务器时区

41 date -R : 查看当前时区

另一台服务器(时间正常)时区:

so,现在要来改时区了

42 tzselect

查看时区

cat /etc/sysconfig/clock

设置时区

tzselect

timeconfig

cat /etc/sysconfig/clock ZONE=”Asia/Shanghai” —> /usr/share/zoneinfo 下面的文件。 UTC=false —> 硬件时钟是否为 UTC 或者说 GMT 时钟。 ARC=false —> 如果是在 Alpha 机器上,则设置为 true 。

把硬件时钟设置为 UTC 的好处就是他能自动设置夏时制,缺点是,在安装有多重操作系统启动的机器上,在另外的操作 系统上时钟会错误。

Linux 的时钟设置文件为:/etc/localtime ,实际上这个文件是 /usr/share/zoneinfo 目录下对应文件的符号连接。 假设我们所处的地区位于上海,那么只要运行以下的命令就可以设置时区了。

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Linux 启动时,其中的一个脚本(/etc/rcd/rcsysinit)会运行 /sbin/hwclock 程序,把当前的硬件时钟复制为系统 时间。hwclock 假定硬件时钟已经设置为本地时钟,除非带有 –utc 参数。脚本文件会读取 /etc/sysconfig/clock 文 件的设置,因此我们不需要修改脚本,直接修改这个配置文件就可以了,根据需要把其中的 UTC 行,设置为 true 或 者 false。

设置硬件时钟时,首先使用 date 命令(“date MMDDhhmmYYYYss”) 设置好系统时钟,然后使用 “/sbin/hwclock –systohc” 把硬件时钟设置为和当前系统时间一致。

如果你在某些应用下面的时间是错误的,那么你在运行 Red Hat Linux 50 或 51,解决的办法是建立 /usr/lib/zoneinfo 到 /usr/share/zoneinfo 的符号连接:

ln -s /usr/share/zoneinfo /usr/lib/zoneinfo

小结:时钟设置的问题本身比较简单,但是它涉及到几个基本的配置文件:

/etc/rcd/rcsysinit /etc/sysconfig/clock /etc/localtime /usr/share/zoneinfo时区的配置文件是/etc/sysconfig/clock。用tzselect命令就可以修改这个配置文件,根据命令的提示进行修改就好了。 但是在实际工作中,发现这种方式是不能够使得服务器上的时间设置马上生效的,而且使用ntpdate去同步时间服务器也不能够更改时间。即使你使用了date命令手工设置了时间的话,如果使用ntpdate去进行时间同步的话,时间又会被改动到原来的错误时区的时间。而生产的机器往往是非常重要的,不能够进行重启等操作。 在网上找了几种方法试了下,发现如果要修改时区并且马上生效,可以更换/etc/localtime 文件来实现。比如我的时区是中国上海,那么就可以使用如下的命令来使得时区的更改生效。 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 然后最好使用下面的命令将更改写入bios。

1 TIMEDATECTL命令

该命令是作为systemd系统和服务管理器的一部分分发的工具,可以用它来查看和更改系统时钟的配置,包括更改当前的日期和时间、设置时区以及可以激活与远端服务器系统时钟的自动同步,是红帽企业版 7 版本新增的命令。

11 展示当前日期和时间

可以使用timedatectl命令来展示当前日期和时间,并且有系统和硬件时钟的配置的详细信息。

[root@strong ~]# timedatectl

Local time: Sat 2019-09-21 15:02:27 CST

Universal time: Sat 2019-09-21 07:02:27 UTC

RTC time: Sat 2019-09-21 07:02:27

Time zone: Asia/Shanghai (CST, +0800)

NTP enabled: no

NTP synchronized: no

RTC in local TZ: no

DST active: n/a

12 更改当前时间

更改当前时间,命令格式为:timedatectl set-time HH:MI:SS。

该命令同时更改系统时间和硬件时钟,执行结果与使用命令date --set 和hwclock --systohc的效果相同。

[root@strong ~]# timedatectl set-time 20:00:00

[root@strong ~]# timedatectl

Local time: Sat 2019-09-21 20:00:04 CST

Universal time: Sat 2019-09-21 12:00:04 UTC

RTC time: Sat 2019-09-21 12:00:05

Time zone: Asia/Shanghai (CST, +0800)

NTP enabled: no

NTP synchronized: no

RTC in local TZ: no

DST active: n/a

[root@strong ~]# timedatectl set-time 2019-09-15

[root@strong ~]# timedatectl

Local time: Sun 2019-09-15 00:00:03 CST

Universal time: Sat 2019-09-14 16:00:03 UTC

RTC time: Sat 2019-09-14 16:00:03

Time zone: Asia/Shanghai (CST, +0800)

NTP enabled: no

NTP synchronized: no

RTC in local TZ: no

DST active: n/a

仅仅更改日期,时间会变为00:00:00,故更改日期时需把对应的时间加上,例如:timedatectl set-time "2019-09-21 15:16:00"。

14 更改时区

141 列出所有时区

[root@strong ~]# timedatectl list-timezones

142 更改时区

[root@strong ~]# timedatectl set-timezone Asia/Shanghai

2 DATE命令

该命令在所有Linux系统都可用,用于设置和查看当前日期和时间,常用于脚本中以格式化的形式用于展示系统时间的详细信息。

21 展示当前日期和时间

1)不带任何格式展示

[root@strong ~]# date

Sat Sep 21 15:24:57 CST 2019

默认展示的是本地时间,以UTC的方式展示,需使用date --utc或date -u。

[root@strong ~]# date --utc

Sat Sep 21 07:25:50 UTC 2019

2)格式化展示

客制化日期和时间的展示格式,使用命令:date +"格式"。

常用的格式为:

控制格式

描述

%H

以HH格式展示小时;

%M

以MM格式展示分钟;

%S

以SS格式展示秒;

%d

以DD格式展示天数;

%m

以MM格式展示月;

%Y

以YYYY格式展示年;

%Z

时区;

%F

以YYYY-MM-DD格式展示日期,和%Y-%m-%d等价;

%T

以HH:MM:SS格式展示时间,和%H:%M:%S等价;

[root@strong ~]# date

Sat Sep 21 15:37:18 CST 2019

[root@strong ~]# date +"%Y-%m-%d %H:%M:%S"

2019-09-21 15:38:00

22 更改当前时间

更改当前时间,命令格式为:date --set HH:MM:SS。

[root@strong ~]# date --set 15:40:20

Sat Sep 21 15:40:20 CST 2019

23 更改当前日期

更改当前日期,命令格式为:date --set YYYY-MM-DD。

[root@strong ~]# date --set 2019-09-25

Wed Sep 25 00:00:00 CST 2019

仅仅更改日期,时间会变为00:00:00,故更改日期时需把对应的时间加上,例如:

[root@strong ~]# date --set "2019-09-21 15:42:35"

Sat Sep 21 15:42:35 CST 2019。

3 CLOCK命令

该命令是用于访问硬件时钟的工具,也称为Real Time Clock(RTC),对应的设置保存在/etc/adjtime文件中。硬件时钟独立于操作系统,即使系统关闭,它仍然工作,用于从硬件时钟展示时间。

31 展示当前日期和时间

[root@strong ~]# hwclock

Sat 21 Sep 2019 03:51:24 PM CST -0368709 seconds

32 设置日期和时间

设置日期和时间的命令为:hwclock --set --date "dd mmm yyyy HH:MM"

[root@strong ~]# hwclock --set --date "21 Sep 2019 16:02:25"

[root@strong ~]# hwclock

Sat 21 Sep 2019 04:02:35 PM CST -0342764 seconds

33 同步日期和时间

可以使用hwclock命令在硬件时钟和当前系统时间直接互相同步。

331 系统时间同步到硬件时钟

[root@strong ~]# hwclock --systohc

332 硬件时钟同步到系统时间

[root@strong ~]# hwclock --hctosys

linuxservertime是指Linux操作系统下的系统时间,它是由系统内核维护的一个计时器,用于记录系统的运行时间。在Linux中,系统时间是基于时钟中断来实现的,时钟中断是由系统硬件触发的,每次中断时系统就会更新一次系统时间。

要查看Linux系统时间,可以使用命令行工具date,输入date命令后即可显示系统当前的时间。在Linux系统中,系统时间通常是UTC时间,也就是协调世界时,它与格林威治标准时间相同,不受时区影响。如果需要将系统时间转换为本地时间,可以使用命令timedatectl来修改时区设置。

需要注意的是,Linux系统时间与BIOS时间是两个不同的概念。BIOS时间是指计算机硬件上的实时时钟,它通常是由电池供电的,即使计算机关闭了,BIOS时间也会继续运行。而Linux系统时间则是基于时钟中断来实现的,只有在系统运行时才会更新。因此,在修改系统时间时需要注意与BIOS时间的同步,以避免出现时间不一致的情况。

总的来说,Linux系统时间是由系统内核维护的一个计时器,它通过时钟中断来更新系统时间。了解Linux系统时间的原理和使用方法,可以帮助我们更好地管理和维护Linux系统。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » Linux系统中C语言如何修改时区

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情