1、查看和修改Linux的时区html
1. 查看当前时区
命令 : "date -R"linux
2. 修改设置Linux服务器时区
方法 A
命令 : "tzselect"sql
方法 B 仅限于RedHat Linux 和 CentOS
命令 : "timeconfig"shell
方法 C 适用于Debian
命令 : "dpkg-reconfigure tzdata"数据库
3. 复制相应的时区文件,替换系统时区文件;或者建立连接文件
cp /usr/share/zoneinfo/主时区/主时区/次时区 /etc/localtimecentos
例如:在设置中国时区使用亚洲/上海(+8)bash
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime服务器
2、查看和修改Linux的时间session
1. 查看时间和日期
命令 : "date"oracle
2.设置时间和日期
例如:将系统日期设定成2009年11月3日的命令
命令 : "date -s 11/03/2009"
将系统时间设定成下午5点55分55秒的命令
命令 : "date -s 17:55:55"
3. 将当前时间和日期写入BIOS,避免重启后失效
命令 : "hwclock -w"
注:
date
不加参数能够直接看到当前日期时间
cal
不加参数能够直接看到本月月历
3、date命令的功能是显示和设置系统日期和时间。
该命令的通常格式为: date [选项] 显示时间格式(以+开头,后面接格式)
date 设置时间格式
命令中各选项的含义分别为:
-d datestr, --date datestr 显示由datestr描述的日期
-s datestr, --set datestr 设置datestr 描述的日期
-u, --universal 显示或设置通用时间 时间域
% H 小时(00..23)
% I 小时(01..12)
% k 小时(0..23)
% l 小时(1..12)
% M 分(00..59)
% p 显示出AM或PM
% r 时间(hh:mm:ss AM或PM),12小时
% s 从1970年1月1日00:00:00到目前经历的秒数
% S 秒(00..59)
% T 时间(24小时制)(hh:mm:ss)
% X 显示时间的格式(%H:%M:%S)
% Z 时区 日期域
% a 星期几的简称( Sun..Sat)
% A 星期几的全称( Sunday..Saturday)
% b 月的简称(Jan..Dec)
% B 月的全称(January..December)
% c 日期和时间( Mon Nov 8 14:12:46 CST 1999)
% d 一个月的第几天(01..31)
% D 日期(mm/dd/yy)
% h 和%b选项相同
% j 一年的第几天(001..366)
% m 月(01..12)
% w 一个星期的第几天(0表明星期天)
% W 一年的第几个星期(00..53,星期一为第一天)
% x 显示日期的格式(mm/dd/yy)
% y 年的最后两个数字( 1999则是99)
% Y 年(例如:1970,1996等)
须要特别说明的是,只有超级用户才能用date命令设置时间,通常用户只能用date命令显示时间。
下列环境变量将会影响到 date 命令的执行效果。 资料整理 www.linuxso.com
LANG
肯定在 LC_ALL 和相应的环境变量(以 LC_ 开头)都不指定语言环境的时候将要使用的缺省语言环境。
LC_ALL
肯定用于覆盖由 LANG 或任何以 LC_ 开头的环境变量设置的任何语言环境类别值的语言环境。
LC_CTYPE
肯定文本数据的字节序列解释为字符时使用的语言环境(例如参数中单对多字节字符)。
LC_MESSAGES
决定写信息应使用的语言。
LC_TIME
肯定由 date 写入的日期和时间字符串的内容。
NLSPATH
为处理 LC_MESSAGES 决定消息目录的位置。
TZ
指定时间和日期使用的时区,除非指定了 -u 选项。若是未设置 TZ 变量且未指定 -u 标志,则使用非指定的系统缺省时区。
例子:
#date //显示当前日期
#date -s //设置当前时间,只有root权限才能设置,其余只能查看。
#date -s 20061010 //设置成20061010,这样会把具体时间设置成空00:00:00
#date -s 12:23:23 //设置具体时间,不会对日期作更改
#date -s “12:12:23 2006-10-10″ //这样能够设置所有时间
CST:中国标准时间(China Standard Time),这个解释多是针对RedHat Linux。
UTC:协调世界时,又称世界标准时间,简称UTC,从英文国际时间/法文协调时间”Universal Time/Temps Cordonné”而来。中国大陆、香港、澳门、台湾、蒙古国、新加坡、马来西亚、菲律宾、澳洲西部的时间与UTC的时差均为+8,也就是UTC+8。
GMT:格林尼治标准时间(旧译格林威治平均时间或格林威治标准时间;英语:Greenwich Mean Time,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,由于本初子午线被定义在经过那里的经线。
设置完系统时间后,还须要同步到硬件时钟上
# clock --systohc
上面命令中,--hctosys表示Hardware Clock to SYStem clock。
Linux系统有系统时间和硬件时间之分:
系统时间: 通常说来就是咱们执行 date命令看到的时间,linux系统下全部的时间调用(除了直接访问硬件时间的命令)都是使用的这个时间。
硬件时间:主板上BIOS中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
一、查看当前系统时间date:
[root@surfer ~]#date
2018年06月 26日星期二 10:09:21 CST
二、设置系统时间date -s +时间
[root@surfer ~]#date -s 10:10:10
2018年06月 26日星期二 10:10:10 CST
三、设置系统时间时,若是还须要设置日期,则要将日期与时间值用双引号包裹起来
[root@surfer ~]#date -s "2018/8/8 10:00:00"
2018年08月 08日星期三 10:00:00 CST
四、查看硬件时间用hwclock或者clock命令:
[root@surfer ~]#hwclock
2018年06月26日 星期二 10时13分02秒 -0.805503 秒
[root@surfer ~]#clock
2018年06月26日 星期二 10时13分07秒 -0.507462 秒
五、将硬件时间写入到系统时间:
[root@surfer ~]#hwclock -s
六、将系统时间写入到硬件时间
[root@surfer ~]#hwclock -w
七、时间同步,Linux系统需安装ntpdate
检查是否安装了ntpdate : rpm -qa | grep ntpdate
若是没有安装则运行以下命令:yum install ntpdate
时间同步命令:ntpdate www.pool.net.org ,其中 www.pool.net.org 是互联网中标准时间服务器
八、contab命令
经过vi /etc/crontab命令能够看到定时任务的书写格式
[root@surfer ~]# vi/etc/crontab
SHELL=/bin/bash #SHELL变量指定了系统要使用哪一个shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin #PATH变量指定了系统执行命令的路径
MAILTO=root #MAILTO变量指定了crond的任务执行信息将经过电子邮件发送给root用户,若是MAILTO变 量的值为空,则表示不发送任务执行信息给用户
# For details seeman 4 crontabs
# Example of jobdefinition:
# .---------------- minute (0 - 59) #分钟
# | .------------- hour (0 -23) #小时
# | | .---------- day of month (1 - 31) #日期
# | | | .------- month (1 - 12) OR jan,feb,mar,apr … #月份
# | | | | .---- day of week (0 - 6)(Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat #周
# | | | | |
# * * * * * user-name command to be executed
在以上各个字段中,还可使用如下特殊字符:
星号(*):表明全部可能的值,例如month字段若是是星号,则表示在知足其它字段的制约条件后每个月都执行该命令操做。
逗号(,):能够用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
横杠(-):能够用整数之间的横杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
斜线(/):能够用斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时斜线能够和星号一块儿使用,例如*/10,若是用在minute字段,表示每十分钟执行一次。
crontab -l :列出当前用户的crontab文件内容
* * * * */usr/local/gse/agent/bin/gsectl watch
crontab -e :编辑当前用户的crontab文件内容
[root@surfer data]#crontab -e
*/1 * * * * echo"hello world">>/data/code.txt
~在这里我添加了一个定时任务*/1 * * * * echo"hello world">>/data/code.txt :意思是每一分钟打印一次hello world,而且重定向到了/data/code.txt文件里面,几分钟事后查看code.txt,出现了以下内容,说明这个定时任务已经开始执行
首先使用w命令查看全部在线用户:
[root@VM_152_184_centos /]# w
20:50:14 up 9 days, 5:58, 3 users, load average: 0.21, 0.05, 0.02
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 101.45.224.253 20:48 0.00s 0.00s 0.00s w
root pts/1 101.45.224.253 20:49 17.00s 0.00s 0.00s -bash
hmj pts/2 101.45.224.253 20:50 2.00s 0.00s 0.00s -bash
执行命令:
pkill -kill -t TTY值
例:踢掉已登陆用户hmj
pkill -kill -t pts/2
再用w命令查看是否已经强制踢掉:
[root@VM_152_184_centos /]# w
20:55:10 up 9 days, 6:03, 2 users, load average: 0.03, 0.03, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 101.45.224.253 20:48 0.00s 0.00s 0.00s w
root pts/1 101.45.224.253 20:49 5:13 0.00s 0.00s -bash
Oracle 9i 开始多了 3 个关于时间的数据类型:TIMESTAMP [(precision)] TIMESTAMP [(precision)] WITH TIME ZONE TIMESTAMP [(precision)] WITH LOCAL TIME ZONE,其中 TIMESTAMP [(precision)] WITH TIME ZONE 保存了时区信息。
1. Oracle 的时区设置
Oracle 的时区能够分为两种,一种是数据库的时区,一种是 session 时区,也就是客户端链接时的时区(通过实验,链接之后再修改客户端的时区,session 的时区不会更改)。
数据库的时区在建立数据库时能够经过在 create database 语句中加上 SET TIME_ZONE = ' { { + | - } hh : mi | time_zone_region } ' 来指定,若是,不指定,默认是按照数据库所在的操做系统时区来设定的。建立以后,能够经过 alter database 来修改。其中 time_zone_region 参数能够经过查询 V$TIMEZONE_NAMES 动态视图来得到全部支持的值。修改以后,须要重启数据库才能生效。常常有人会碰到没法修改的状况:
SQL> alter database set time_zone='+06:00';
alter database set time_zone='+06:00'
*
ERROR at line 1:
ORA-02231: missing or invalid option to ALTER DATABASE
TOM 对此问题有过解释,TIME_ZONE 的设定主要是为了 WITH LOCAL TIME ZONE,当 session 的时区和数据库的时区不一样时,oracle 根据时区的差距转换到数据库的时间,再保存到数据库的 WITH LOCAL TIME ZONE 类型中,他是不保存时区的,因此须要 TIME_ZONE 来进行各类时区之间时间的转换(WITH TIME ZONE 类型保存了原始的时区,因此不须要 TIME_ZONE 的设置也能够进行各类时区之间的转换)。但数据库中一旦有了该类型,就不能经过 alter database 修改时区了,会获得上面的错误,能够经过下面的语句得到全部包含该类型的表,将他们删除以后,再修改。
select u.name || '.' || o.name || '.' || c.name TSLTZcolumn
from sys.obj$ o, sys.col$ c, sys.user$ u
where c.type# = 231
and o.obj# = c.obj#
and u.user# = o.owner#;
(通常查询后的结果为:OE.ORDERS.ORDER_DATE,指的是OE用户下的ORDERS表的ORDER_DATE字段使用了时区的信息:WITH LOCAL TIME ZONE,将此信息去掉就能够再修改了,修改好了以后须要重启数据库才能生效)
Session 的时区是根据客户端的时区来决定的,固然链接之后也能够经过 alter session 来改变。WITH LOCAL TIME ZONE 类型会根据 TIME_ZONE 的设置,自动把时间转换为 session 所在时区的时间显示出来,而 WITH TIME ZONE 由于保存了时区,不须要根据 TIME_ZONE 的设置来转换。
2. 查看时区
能够分别使用 SESSIONTIMEZONE / DBTIMEZONE 内建函数查看 session 和数据库时区:
SYS@SKYDB> select dbtimezone from dual;
DBTIME
------
+08:00
SYS@SKYDB> select sessiontimezone from dual;
SESSIONTIMEZONE
---------------------------------------------
+09:00
另外能够用 TZ_OFFSET 查询某时区和 UTC 之间的差值。
TZ_OFFSET ( { 'time_zone_name'
| '{ + | - } hh : mi'
| SESSIONTIMEZONE
| DBTMEZONE }
)
SELECT TZ_OFFSET('US/Eastern') FROM DUAL;
TZ_OFFS
-------
-04:00
SELECT TZ_OFFSET(DBTIMEZONE) FROM DUAL;
TZ_OFFSET(DBTI
--------------
+08:00
其中 time_zone_name 也能够从 V$TIMEZONE_NAMES 得到。
3. 几个内建时间函数的比较
sysdate/systimestamp 都是返回数据库的时间而且使用数据库的时区,他们返回的是操做系统的时间。sysdate 返回的是 date 类型,没有时区信息,操做系统上是什么时间就返回什么时间;systimestamp 返回 TIMESTAMP WITH TIME ZONE 类新,有时区信息:
SYS@SKYDB> select sysdate from dual;
SYSDATE
-------------------
2006-08-03 10:01:31
SYS@SKYDB> select systimestamp from dual;
SYSTIMESTAMP
-----------------------------------------------
03-AUG-06 10.02.21.093000 AM +08:00
SYS@SKYDB> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
修改操做系统时区为 +02:00
SYS@SKYDB> startup
ORACLE instance started.
Total System Global Area 89202456 bytes
Fixed Size 454424 bytes
Variable Size 62914560 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
SYS@SKYDB> select sysdate from dual;
SYSDATE
-------------------
2006-08-03 04:03:37
SYS@SKYDB> select systimestamp from dual;
SYSTIMESTAMP
----------------------------------------------
03-AUG-06 04.04.15.687000 AM +02:00
注:不知道为何不能经过 ipc 来链接本地数据了,登录时使用 sqlplus "/@skydb as sysdba",也就是使用了监听器来链接,但在家里作相同的实验,经过 ipc 链接 sqlplus "/as sysdba",修改时区后,sysdate 依然显示修改前的时间,而 systimestamp 却正确,不知道是什么缘由:
SQL> select sysdate from dual;
SYSDATE
-------------------
2006-02-08 22:21:40
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 10.22.38.578000 PM +08:00
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
修改时区为 +09:00
SQL> startup
ORACLE instance started.
Total System Global Area 131145064
bytes
Fixed Size 453992
bytes
Variable Size 109051904
bytes
Database Buffers 20971520
bytes
Redo Buffers 667648
bytes
Database mounted.
Database opened.
SQL> select sysdate from dual;
SYSDATE
---------
02-AUG-06
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2006-08-02 22:32:59
<- 仍是以前的时间
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 11.35.05.171000 PM +09:00
<- 时间正确
另外,有个初始化参数 fixed_date,能够设置 sysdate 返回指定的时间:
alter system set fixed_date='2005-04-04-11-00-00'
this fixed_date is normally used, in oracle, for dubugging purpose.
once finishing it, you can set it back:
alter system set fixed_date=none
current_timestamp/current_date 也会返回数据库的时间,但转换为 session 的时区进行显示,可使用 alter session set time_zone 改变 session 时区。
4. 四个日期时间类型的实验
SQL> select dbtimezone from dual;
DBTIME
------
+06:00
SQL> select sessiontimezone from dual;
SESSIONTIMEZONE
---------------------------------------------------------------------------
+08:00
SQL> ed
Wrote file afiedt.buf
1 create table tztest(a date,
2 b timestamp(0),
3 c timestamp(0) with time zone,
4* d timestamp(0) with local time zone)
SQL> /
Table created.
SQL> alter session set nls_date_format ='yyyy-dd-mm hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2006-02-08 22:21:40
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 10.22.38.578000 PM +08:00
SQL> select current_date from dual;
CURRENT_DATE
-------------------
2006-02-08 22:23:50
SQL> select current_timestamp from dual;
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 10.24.04.031000 PM +08:00
SQL> insert into tztest
2 values(sysdate,systimestamp,systimestamp,systimestamp);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from tztest;
A
-------------------
B
---------------------------------------------------------------------------
C
---------------------------------------------------------------------------
D
---------------------------------------------------------------------------
2006-02-08 22:25:59
02-AUG-06 10.25.59 PM
02-AUG-06 10.25.59 PM +08:00
02-AUG-06 10.25.59 PM
SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production
修改了客户端操做系统的时区
C:\Documents and Settings\Administrator>sqlplus sky/xxxx
SQL*Plus: Release 9.2.0.3.0 - Production on Wed Aug 2 23:28:01 2006
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2006-08-02 22:28:49
<-数据库没有重启,时间依然是修改前的
SQL> select systimestamp from dual;
SYSTIMESTAMP
---------------------------------------------------------------------------
02-AUG-06 11.29.33.609000 PM +09:00
<- 这里却已经改变了,有时区信息,自动转换了?
SQL> select * from tztest;
A
-------------------
B
---------------------------------------------------------------------------
C
---------------------------------------------------------------------------
D
---------------------------------------------------------------------------
2006-08-02 22:25:59
<- 没变
02-AUG-06 10.25.59 PM
<- 没变
02-AUG-06 10.25.59 PM +08:00
<- 保存时区信息
02-AUG-06 11.25.59 PM
<-自动转换为 session 的时区