linux OS与SQL修改时区,系统时间
一、查看和修改Linux的时区
1. 查看当前时区
命令 : "date -R"
2. 修改设置Linux服务器时区
方法 A
命令 : "tzselect"
方法 B 仅限于RedHat Linux 和 CentOS
命令 : "timeconfig"
方法 C 适用于Debian
命令 : "dpkg-reconfigure tzdata"
3. 复制相应的时区文件,替换系统时区文件;或者创建链接文件
cp /usr/share/zoneinfo/主时区/主时区/次时区 /etc/localtime
例如:在设置中国时区使用亚洲/上海(+8)
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
二、查看和修改Linux的时间
1. 查看时间和日期
命令 : "date"
2.设置时间和日期
例如:将系统日期设定成2009年11月3日的命令
命令 : "date -s 11/03/2009"
将系统时间设定成下午5点55分55秒的命令
命令 : "date -s 17:55:55"
3. 将当前时间和日期写入BIOS,避免重启后失效
命令 : "hwclock -w"
注:
date
不加参数可以直接看到当前日期时间
cal
不加参数可以直接看到本月月历
三、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 //显示当前日期
#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中的时间,由主板电池供电来维持运行,系统开机时要读取这个时间,并根据它来设定系统时间(注意:系统启动时根据硬件时间设定系统时间的过程可能存在时区换算,这要视具体的系统及相关设置而定)。
1、查看当前系统时间date:
[root@surfer ~]#date
2018年06月 26日星期二 10:09:21 CST
2、设置系统时间date -s +时间
[root@surfer ~]#date -s 10:10:10
2018年06月 26日星期二 10:10:10 CST
3、设置系统时间时,如果还需要设置日期,则要将日期与时间值用双引号包裹起来
[root@surfer ~]#date -s "2018/8/8 10:00:00"
2018年08月 08日星期三 10:00:00 CST
4、查看硬件时间用hwclock或者clock命令:
[root@surfer ~]#hwclock
2018年06月26日 星期二 10时13分02秒 -0.805503 秒
[root@surfer ~]#clock
2018年06月26日 星期二 10时13分07秒 -0.507462 秒
5、将硬件时间写入到系统时间:
[root@surfer ~]#hwclock -s
6、将系统时间写入到硬件时间
[root@surfer ~]#hwclock -w
7、时间同步,Linux系统需安装ntpdate
检查是否安装了ntpdate : rpm -qa | grep ntpdate
如果没有安装则运行如下命令:yum install ntpdate
时间同步命令:ntpdate www.pool.net.org ,其中 www.pool.net.org 是互联网中标准时间服务器
8、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,出现了如下内容,说明这个定时任务已经开始执行
Linux用root强制踢掉已登录用户
首先使用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的时区问题
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 动态视图来获得所有支持的值。修改之后,需要重启数据库才能生效。经常有人会碰到无法修改的情况:
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 修改时区了,会得到上面的错误,可以通过下面的语句获得所有包含该类型的表,将他们删除之后,再修改。
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 却正确,不知道是什么原因:
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. 四个日期时间类型的实验
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 的时区