看看一个很简单的程序:
int main(int argc, char *argv[])
{
time_t tm;
struct tm *tp;
time(&tm);
tp = localtime(&tm);
#define SCN_TM_FMT "%04u-%02u-%02u %02u:%02u:%02u"
#define SCN_TP_FMT(tp) tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec
fprintf(stderr, SCN_TM_FMT" isday:%d\n", SCN_TP_FMT(tp), tp->tm_isdst);
return (0);
}
不同的系统输出不一样:
我自己的Linux输出:
[oracle@asm odt]$ bin/odt_ut
2010-07-09 20:07:54 isday:0
[oracle@asm odt]$ uname -a
Linux asm 2.6.9-22.EL #1 Mon Sep 19 18:20:28 EDT 2005 i686 i686 i386 GNU/Linux
公司AIX输出:
P270$(/home/shangj/ganhk/dmp/module/c/v0/odt)uname -a
AIX P270 2 5 0005A9DC4C00
P270$(/home/shangj/ganhk/dmp/module/c/v0/odt)bin/odt_ut
2010-07-13 15:29:15 isday:1
主要是tm_isdst上面为什么不一样,下面这遍文章应该可以解释这个问题了。
++++++++++++++++++++++++++++++++++++
由于系统选择了夏令时,导致数据库和系统时间差1个小时
echo $TZ
修改/etc/environment 。设置TZ=BEIST-8
处理方法这里有个帖子不错
http://www.fengjian.org/mine/blog/article.asp?id=122
某日发现IBM小型机的AIX系统时间快一个小时,故经过确认,修改应该没有问题。
其实上有问题—oracle数据库记录的一些数据都是快一小时,看看系统时间和oracle取到的时间又是对的,如下:
oracle:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as datetime from dual;
DATETIME
---------------------
2008-05-23 19:14:56
aix:
bash-3.00# date
Fri May 23 19:14:56 BEIDT 2008
bash-3.00# echo $TZ
BEIST-8BEIDT
看看么好像对的,北京时间,其实问题是出在DT的问题上,好像是指夏令!这里有一些解释
-------
夏令时Daylight Saving Time就查了一下,原来是夏令时,但中文中的夏令时,我也不懂呀!又到百度/google看了一下,原来如此!
夏令时,又称“日光节约时制”(Daylight Saving Time),是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。
据说最早建议使用夏时制的是本杰明·富兰克林,他在任美国驻法国大使期间,由于习惯于当时美国农村贵族的早睡早起生活,早上散步时看到法国人10点才起床,夜生活过到深夜。于是他在1784年的一期《巴黎杂志》上发表了一篇文章,说法国人的生活习惯浪费了大好的阳光,建议法国人早睡早起,说每年可以节约6千4百万磅蜡烛。但他当时并没有建议实行夏时制,因为当时根本还没有统一的时区划分。不过夏时制在英语里就是“节约阳光时间”
1942年,第二次世界大战期间,美国又实行了夏时制,1945年战争结束后取消。1966年,美国重新实行夏时制。欧洲大部分国家从1976年,即第四次中东战争导致首次石油危机3年后(1973年)开始实行夏时制。
-------------------
OK,问题所在,下面我们查查看看如何改!aix下其实用一下
bash-3.00# smitty chtz
Use DAYLIGHT SAVINGS TIME?
Move cursor to desired item and press Enter.
# Does this time zone go on
# DAYLIGHT SAVINGS TIME?
#
1 yes
2 no
F1=Help F2=Refresh F3=Cancel
F8=Image F10=Exit Enter=Do
/=Find n=Find Next
选2 no
CUT (Coordinated Universal Time) Time Zone
Move cursor to desired item and press Enter.
[TOP]
(CUT0) Coordinated Universal Time (CUT)
(GMT0) United Kingdom (CUT)
(WET0) Western Europe (CUT)
(AZOREST1) Azores; Cape Verde (CUT -1)
(FALKST2) Falkland Islands (CUT -2)
(GRNLNDST3) Greenland; East Brazil (CUT -3)
(AST4) Central Brazil (CUT -4)
(EST5) Eastern U.S.; Colombia (CUT -5)
(CST6) Central U.S.; Honduras (CUT -6)
(MST7) Mountain U.S. (CUT -7)
(PST8) Pacific U.S.; Yukon (CUT -8)
(AST9) Alaska (CUT -9)
(HST10) Hawaii; Aleutian (CUT-10)
(BST11) Bering Straits (CUT-11)
(NZST-12) New Zealand (CUT+12)
(MET-11) Solomon Islands (CUT+11)
(EET-10) Eastern Australia (CUT+10)
(JST-9) Japan (CUT +9)
(KORST-9) Korea (CUT +9)
(WAUST-8) Western Australia (CUT +8)
(TAIST-8) Taiwan (CUT +8)
(BEIST-8) Peoples Rep. China (CUT +8)
(THAIST-7) Thailand (CUT +7)
(TASHST-6) Tashkent; Central Asia (CUT +6)
[MORE...7]
F1=Help F2=Refresh F3=Cancel
F8=Image F10=Exit Enter=Do
/=Find n=Find Next
选择:
BEIST-8) Peoples Rep. China (CUT +8)
即可:)
提示:Any changes made to the time zone will take effect at the next system boot.
重启生效!
老实说不了解国外的一些制度,有时后真得不理解问题的原因,当我看到修改时区的界面,看到Daylight Saving Time都不知道是什么意思!