- 論壇徽章:
- 0
|
根據(jù)用戶輸入需要對(duì)應(yīng)的日期轉(zhuǎn)成時(shí)間戳傳給程序,用的是struct tm賦值, mktime(&tm)轉(zhuǎn)時(shí)間戳。
問題是,當(dāng)系統(tǒng)的時(shí)區(qū)調(diào)到支持夏令時(shí)區(qū)時(shí),(.e.g. GMT-5)則會(huì)在進(jìn)出夏令時(shí)有問題,
測試程序如下:
//GMT-5
struct tm tm1;
struct tm tm2;
time_t clock;
//3-8 00:00
memset(&tm1, 0, sizeof(tm1));
memset(&tm2, 0, sizeof(tm2));
tm1.tm_year = 109;
tm1.tm_mon = 2;
tm1.tm_mday = 8;
tm1.tm_hour = 0;
tm1.tm_min = 0;
tm1.tm_sec = 0;
tm1.tm_isdst = 0;
printf("before: %04d-%02d-%02d %02d:%02d:%02d\n", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
printf("before: tm_isdst = %d\n", tm1.tm_isdst);
clock = mktime(&tm1);
printf("%d\n", (int)clock);
localtime_r(&clock, &tm2);
printf("after: %04d-%02d-%02d %02d:%02d:%02d\n", tm2.tm_year+1900,tm2.tm_mon+1,tm2.tm_mday,tm2.tm_hour,tm2.tm_min,tm2.tm_sec);
//printf("%s\n", tm1.tm_zone);
printf("------------------------------\n");
//11-2 00:00
memset(&tm1, 0, sizeof(tm1));
memset(&tm2, 0, sizeof(tm2));
tm1.tm_year = 109;
tm1.tm_mon = 10;
tm1.tm_mday = 1;
tm1.tm_hour = 0;
tm1.tm_min = 0;
tm1.tm_sec = 0;
tm1.tm_isdst = 0;
printf("before: %04d-%02d-%02d %02d:%02d:%02d\n", tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday,tm1.tm_hour,tm1.tm_min,tm1.tm_sec);
printf("before: tm_isdst = %d\n", tm1.tm_isdst);
clock = mktime(&tm1);
printf("%d\n", (int)clock);
localtime_r(&clock, &tm2);
printf("after: %04d-%02d-%02d %02d:%02d:%02d\n", tm2.tm_year+1900,tm2.tm_mon+1,tm2.tm_mday,tm2.tm_hour,tm2.tm_min,tm2.tm_sec);
|
當(dāng)tm.tm_isdst = 0 (不啟用夏令時(shí))時(shí),則進(jìn)入夏令時(shí)OK,出夏令時(shí)會(huì)多一個(gè)小時(shí)。
root@UTM25:/opt/CPSecure/webui/private# ./test
before: 2009-03-08 00:00:00
before: tm_isdst = 0
1236488400
after: 2009-03-08 00:00:00
------------------------------
before: 2009-11-01 00:00:00
before: tm_isdst = 0
1257051600
after: 2009-11-01 01:00:00
當(dāng)tm.tm_isdst = 1(啟用夏令時(shí)) 時(shí),則進(jìn)入夏令時(shí)時(shí)間會(huì)提前一個(gè)小時(shí),出夏令時(shí)OK。
root@UTM25:/opt/CPSecure/webui/private# ./test
before: 2009-03-08 00:00:00
before: tm_isdst = 1
1236484800
after: 2009-03-07 23:00:00
------------------------------
before: 2009-11-01 00:00:00
before: tm_isdst = 1
1257048000
after: 2009-11-01 00:00:00
[ 本帖最后由 flyfeel 于 2009-6-15 10:57 編輯 ] |
|