GMT和PST--关于时区的知识

原文链接:http://www.douban.com/note/147558183/

————————————————————————————————————————————————

我们在网上浏览,在虚拟时空漫游世界时,经常会遇到时区的困扰,这篇文章是什么时间发布的?邮件是什么时间发出的?GMT和PST各代表什么意思,如何换算?等等.
我通过互联网搜集了一些小知识,供大家参考。

1、概念和换算
PST - 美国太平洋标准时间
GMT 格林威治标准时间


几个换算公式,因为是24进制,看起来有点怪:
(GMT +8)-16 =PST
PST+7 = GMT
PST+16 = GMT + 8(中国)

我们是东八区,加州是西八区,中间差16个小时。

2、关于日期中的时区标志。

由于都在互联网上,大家在各个时区的事件表示有所不同,因此日期要转换到当前时区的日期和时间,在互联网上,大家一般都用CTS(世界标准时间)有称作GMT(格林尼治时间)。
譬如日期时间为:Sat, 30 Mar 2002 13:27:08 -0800,我们当前所在的时区为正8区(北京时间),则用我们所在时区表示就是 Sat, 30 Mar 2002 29(13+16):27:08 即Sun, 31 Mar 2002 6:27:08 +8000。 ---??
目前存在的时区有:
GMT 格林威治标准时间 GMT
UTC 全球标准时间 GMT
ECT 欧洲中部时间 GMT+1:00
EET 东欧时间 GMT+2:00
ART (阿拉伯)埃及标准时间 GMT+2:00
EAT 东非时间 GMT+3:00
MET 中东时间 GMT+3:30
NET 近东时间 GMT+4:00
PLT 巴基斯坦拉合尔时间 GMT+5:00
IST 印度标准时间 GMT+5:30
BST 孟加拉国标准时间 GMT+6:00
VST 越南标准时间 GMT+7:00
CTT 中国台湾时间 GMT+8:00
JST 日本标准时间 GMT+9:00
ACT 澳大利亚中部时间 GMT+9:30
AET 澳大利亚东部时间 GMT+10:00
SST 所罗门标准时间 GMT+11:00
NST 新西兰标准时间 GMT+12:00
MIT 中途岛时间 GMT-11:00
HST 夏威夷标准时间 GMT-10:00
AST 阿拉斯加标准时间 GMT-9:00
PST 太平洋标准时间 GMT-8:00
PNT 菲尼克斯标准时间 GMT-7:00
MST 西部山脉标准时间 GMT-7:00
CST 中部标准时间 GMT-6:00
EST 东部标准时间 GMT-5:00
IET 印第安那东部标准时间 GMT-5:00
PRT 波多黎各和美属维尔京群岛时间 GMT-4:00
CNT 加拿大纽芬兰时间 GMT-3:30
AGT 阿根廷标准时间 GMT-3:00
BET 巴西东部时间 GMT-3:00
CAT 中非时间 GMT-1:00

3、教你怎样在Oracle 9i中正确转换时区

在Oracle9i之前,虽然有一个NEW_TIME函数可以改变DATE的时间戳部分,但是还没有专门用来存储时区信息的数据类型。在Oracle9i中,我们可以使用DBTIMEZONE伪字段查询数据库的时区,使用SESSIONTIMEZONE伪字段查询会话的时区。
但是,对于大多数数据库,这些值都是-07:00之类的偏移值,因此对于NEW_TIME函数是没有用的。Oracle9i有关NEW_TIME的文档建议使用FROM_TZ来替代,但是这可能会产生误导。FROM_TZ只将一个时区应用到一个时间戳上;它并不能把一个时区转换成另外一个时区。
其实有一个比较好的方法(从文档中得到这个方法可能有点难)。首先,为了完成这个工作,在正确的时区内需要一个TIMESTAMP WITH ZONE数据类型。然后,如果你将关键字AT TIME ZONE应用到那个值,它就会自动地调整为新的时区和日期。
  select (timestamp '2003-04-06 01:59:59' at time zone 'PDT') at time zone 'GMT'   from dual;
  06-APR-03 08.59.59.00000000 AM GMT

这个语句将为太平洋白天时间(即其切换到PST之前的时刻)构造一个TIMESTAMP WITH TIME ZONE然后再将其转换到GMT。AT TIME ZONE关键字也接受默认的偏移值语法:
  select (timestamp '2003-04-06 02:00:00' at time zone '-07:00') at time zone   '00:00' from dual;
  06-APR-03 09.00.00.000000000 AM +00:00  
你还可以使用伪字段来自动调整当前会话的时区:
     select current_timestamp at time zone dbtimezone from dual;
上面的表达式返回一个当前会话的本地时间(数据类型为时区),重新调整数据库的时区,调整后的时区将与SYSTIMESTAMP的结果相等。有了以上的这些信息,就可以构造一个比较好的NEW_TIME函数:
    create or replace function my_new_time (p_dwtz timestamp with time zone,     p_tz varchar2   ) return date is
  begin
    return cast(p_dwtz at time zone p_tz as date);   
end
my_new_time;
/
show errors;
select my_new_time(sysdate,'+08:00') from dual;
即使第一个参数被标记为一个timestamp with time zone,你依然可以传入一个TIMESTAMP和DATE,这样由于Oracle的自动转型操作,得到的时间将是会话在本地时区的当前时间。这个函数接受包括偏移值在内的任何可以被TIMESTAMP识别的时区,然后将接受的时区调整为正确的值。

4、Oracle/Sqlserver中的日期函数(节选)(35).系统时间
S:select getdate() value
O:select sysdate value from dual
(36).前后几日
直接与整数相加减
(37).求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from dual
select to_char(sysdate,'yyyy-mm-dd') value from dual
(38).求时间
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from dual
(39).取日期时间的其他部分
S:DATEPART 和 DATENAME 函数 (第一个参数决定)
O:to_char函数 第二个参数决定
参数---------------------------------下表需要补充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O无效)
dayofyear dy, y (O表星期)
day dd, d (d O无效)
week wk, ww (wk O无效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S无效)
minute mi, n (n O无效)
second ss, s (s O无效)
millisecond ms (O无效)
----------------------------------------------
(40).当月最后一天
S:不知道
O:select LAST_DAY(sysdate) value from dual
(41).本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
(42).字符串转时间
S:可以直接转或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
(43).求两日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用两个日期相减(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
(44).根据差值求新的日期(比如分钟)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
(45).求不同时区时间
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----时区参数,北京在东8区应该是Ydt-------
AST ADT 大西洋标准时间
BST BDT 白令海标准时间
CST CDT 中部标准时间
EST EDT 东部标准时间
GMT 格林尼治标准时间
HST HDT 阿拉斯加 夏威夷标准时间
MST MDT 山区标准时间
NST 纽芬兰标准时间
PST PDT 太平洋标准时间
YST YDT YUKON标准时间

5、redhat9终端方式下更改时区偶曾经问过的问题现在仍有兄弟在问特整理了一下
由于redhat9不能象以前那样配置时区。经常会出现错误
没图形界面!

/usr/sbin/timeconfig
错误如下
......
用 redhat-config-time 要求有xwin :redhat-config-date requires a currently running X server.

所以更改时区可以使用 tzselect這个指令,來修改你的时区
当然你也可不用命令,如果习惯文件修改的话
可修改/etc/sysconfig/clock
ZONE=Asia/Shanghai ( 查/usr/share/zoneinfo 下面的文件。 )
UTC=false ( 硬件时钟是否为 UTC 或者说 GMT 时钟。 )
ARC=false (如果是在 Alpha 机器上,则设置为 true 。 )
(把硬件时钟设置为 UTC 的好处就是他能自动设置夏时制,缺点时,在安装有多重操作系统启动的机器上,在另外的操作系统上时钟会错误。 )
根据自己的需要选你所在时区后,然后
rm /etc/localtime
是以上海为例的哦
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
重起机器后时区就改变了 。
如果你在某些应用下面的时间是错误的,那么你在运行 Red Hat Linux 5.0 或 5.1,解决的办法是建立 /usr/lib/zoneinfo 到 /usr/share/zoneinfo 的符号连接:
ln -s /usr/share/zoneinfo /usr/lib/zoneinfo

时区 与 UTC 的偏移量 描述
NZDT +13:00 新西兰白昼时间(夏时制)
IDLE +12:00 国际日期变更线,东边
NZST +12:00 新西兰标准时间
NZT +12:00 新西兰时间
AESST +11:00 澳大利亚东部标准夏时制
ACSST +10:30 中澳大利亚标准夏时制
CADT +10:30 中澳大利亚夏时制
SADT +10:30 南澳大利亚夏时制
AEST +10:00 澳大利亚东部标准时间
EAST +10:00 东澳大利亚标准时间
GST +10:00 关岛标准时间,(USSR Zone 9?)
LIGT +10:00 澳大利亚墨尔本
ACST +09:30 中澳大利亚标准时间
CAST +09:30 中澳大利亚标准时间
SAT +9:30 南澳大利亚标准时间
AWSST +9:00 澳大利亚西部标准夏时制
JST +9:00 日本标准时间,(USSR Zone 8)
KST +9:00 韩国标准时间
WDT +9:00 西澳大利亚夏时制
MT +8:30 毛里求斯时间(?)
AWST +8:00 澳大利亚西部标准时间
CCT +8:00 中国沿海时间
WADT +8:00 西澳大利亚夏时制
WST +8:00 西澳大利亚时间
JT +7:30 爪哇时间(译注:这里的 Java 可不是语言)
WAST +7:00 西澳大利亚标准时间
IT +3:30 伊朗时间
BT +3:00 巴格达时间
EETDST +3:00 东欧夏时制
CETDST +2:00 中欧夏时制
EET +2:00 东欧,(USSR Zone 1)
FWT +2:00 法国冬时制
IST +2:00 以色列标准时间
MEST +2:00 中欧夏时制
METDST +2:00 中欧白昼时间
SST +2:00 瑞典夏时制
BST +1:00 英国夏时制
CET +1:00 中欧时间
DNT +1:00 Dansk Normal Tid(?)
DST +1:00 Dansk Standard Time (?)
FST +1:00 法国夏时制
MET +1:00 中欧时间
MEWT +1:00 中欧冬时制
MEZ +1:00 中欧时区
NOR +1:00 挪威标准时间
SET +1:00 Seychelles Time(?)
SWT +1:00 瑞典冬时制
WETDST +1:00 西欧光照利用时间(夏时制)
GMT 0:00 格林威治平均时间
WET 0:00 西欧
WAT -1:00 西非时间
NDT -2:30 纽芬兰(新大陆)白昼时间
ADT -03:00 大西洋白昼时间
NFT -3:30 纽芬兰(新大陆)标准时间
NST -3:30 纽芬兰(新大陆)标准时间
AST -4:00 大西洋标准时间(加拿大)
EDT -4:00 东部白昼时间
ZP4 -4:00 GMT +4 小时
CDT -5:00 中部白昼时间
EST -5:00 东部标准时间
ZP5 -5:00 GMT +5 小时
CST -6:00 中部标准时间
MDT -6:00 山区白昼时间(译注:Mountain Daylight Time那位知道怎么译?)
ZP6 -6:00 GMT +6 小时
MST -7:00 山区标准时间
PDT -7:00 太平洋白昼时间
PST -8:00 太平洋标准时间
YDT -8:00 Yukon 白昼时间
HDT -9:00 夏威仪/阿拉斯加白昼时间
YST -9:00 Yukon 标准时间
AHST -10:00 夏威仪-阿拉斯加标准时间
CAT -10:00 中阿拉斯加时间
NT -11:00 州时间(Nome Time)
IDLW -12:00 国际日期变更线,西边

-----------英文版--老版本,歧视性,没有中国大陆,抗议!!!----

常用的几个时区:
GMT:Greenwich Mean Time
ET:U.S. Eastern Time -5
PST:Pacific Standard Time -8

GMT -11:00 Samoa
GMT -10:00 U.S. Hawaiian Time
GMT -09:30 Marquesas
GMT -09:00 U.S. Alaska Time
GMT -08:30 Pitcarn
GMT -08:00 Pacific Time
GMT -07:00 U.S. Mountain Time
GMT -07:00 U.S. Mountain Time (Arizona)
GMT -06:00 U.S. Central Time
GMT -06:00 Mexico
GMT -05:00 U.S. Eastern Time
GMT -05:00 U.S. Eastern Time (Indiana)
GMT -05:00 Columbia, Peru, South America
GMT -04:00 Atlantic Time
GMT -03:30 Newfoundland, Canada
GMT -03:00 Argentina
GMT -03:00 Brazil
GMT -02:00 Mid-Atlantic
GMT -01:00 Azores
GMT U.K., Spain
GMT +01:00 Western Europe
GMT +02:00 Eastern Europe
GMT +02:00 Egypt
GMT +02:00 Israel
GMT +03:00 Russia
GMT +03:00 Saudi Arabia
GMT +03:30 Iran
GMT +04:00 Arabian
GMT +04:30 Afghanistan
GMT +05:00 Pakistan, West Asia
GMT +05:30 India
GMT +06:00 Bangladesh, Central Asia
GMT +06:30 Burma
GMT +07:00 Bangkok, Hanoi, Jakarta
GMT +08:00 China, Taiwan
GMT +08:00 Singapore
GMT +08:00 Australia (WT)
GMT +09:00 Japan
GMT +09:00 Korea
GMT +09:30 Australia (CT)
GMT +10:00 Australia (ET)
GMT +10:30 Australia (Lord Howe)
GMT +11:00 Central Pacific
GMT +11:30 Norfolk Islands
GMT +12:00 Fiji, New Zealand

6、JAVA中的时区

java.util 类 TimeZonejava.lang.Object
 java.util.TimeZone
所有已实现的接口:

Serializable, Cloneable
直接已知子类:
SimpleTimeZone
public abstract class TimeZone
extends Object
implements Serializable, Cloneable
TimeZone 表示时区偏移量,也可以计算夏令时。

    通常,使用 getDefault 获得 TimeZone,getDefault 基于程序运行所在的时区创建 TimeZone。例如,对于在日本运行的程序,getDefault 基于日本标准时间创建 TimeZone 对象。

    也可以用 getTimeZone 及时区 ID 获取 TimeZone 。例如美国太平洋时区的时区 ID 是 "America/Los_Angeles"。因此,可以使用下面语句获得美国太平洋时间 TimeZone 对象:
 TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles");
    可以使用 getAvailableIDs 方法来对所有受支持的时区 ID 进行迭代。可以选择受支持的 ID 来获得 TimeZone。如果想要的时区无法用受支持的 ID 之一表示,那么可以指定自定义时区 ID 来生成 TimeZone。自定义时区 ID 的语法是:
CustomID: GMT Sign Hours : Minutes
         GMT Sign Hours Minutes
         GMT Sign Hours
Sign: 下面之一
         + -
Hours:
         Digit
         Digit Digit
Minutes:
         Digit Digit
Digit: 下面之一
         0 1 2 3 4 5 6 7 8 9
    Hours 必须在 0 至 23 之间,Minutes 必须在 00 至 59 之间。例如,"GMT+10" 和 "GMT+0010" 分别意味着比 GMT 提前 10 小时和 10 分钟。

    格式是与区域无关的,并且数字必须取自 Unicode 标准的 Basic Latin 块。没有夏令时转换安排可以用自定义时区 ID 指定。如果指定的字符串与语法不匹配,就使用 "GMT"。

  当创建一个 TimeZone 时,指定的自定义时区 ID 采用下面的语法进行标准化:

 NormalizedCustomID:
         GMT Sign TwoDigitHours : Minutes
Sign: 下面之一
         + -
 TwoDigitHours:
         Digit Digit
 Minutes:
         Digit Digit
 Digit: 下面之一
         0 1 2 3 4 5 6 7 8 9
 
例如,TimeZone.getTimeZone("GMT-8").getID() 返回 "GMT-08:00"。

关于三字母时区 ID

为了与 JDK 1.1.x 兼容,一些三字母时区 ID(比如 "PST"、"CTT"、"AST")也受支持。但是,它们的使用被废弃,这是因为相同的缩写经常用于多个时区(例如,"CST" 可以是美国的 "Central Standard Time" 和 "China Standard Time"),但是 Java 平台只可以识别其中一种。


7:来源网址:

http://www.hi-pda.com/forum/archiver/tid-334908.html

http://www.soudie.net/top_27701_cat_21/

http://database.ccidnet.com/art/1105/20070115/1001341_1.html

http://www.cnblogs.com/zhangqh/archive/2005/09/08/232598.html

http://www.chinaunix.net/jh/4/468256.html

http://eyejava.javaeye.com/blog/29653

http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/util/TimeZone.html

你可能感兴趣的:(GMT和PST--关于时区的知识)