国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言實現(xiàn)時區(qū)轉(zhuǎn)換函數(shù)的實例

2020-01-26 13:58:16
字體:
供稿:網(wǎng)友

C語言實現(xiàn)時區(qū)轉(zhuǎn)換函數(shù)的實例

時區(qū)轉(zhuǎn)換函數(shù)

功能:

把時區(qū)1的時間轉(zhuǎn)換成時區(qū)2的時間

參數(shù):

arg1 -- 輸入時間
arg2 -- 時區(qū)1(也是arg1當(dāng)前時間所在的時區(qū))
arg3 -- 時區(qū)2(要轉(zhuǎn)換的時區(qū)的時間) 

要求:

參數(shù)arg1類型可為timestamp

24個時區(qū)(由1-24表示) 

在 pg_proc.h 中添加函數(shù)定義

src/include/catalog/pg_proc.h

 DATA(insert OID = 6668 ( timezone_convert PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1114 "1114 23 23" _null_ _null_ _null_ _null_ _null_ timezone_convert _null_ _null_ _null_ )); DESCR("timestamp convert.");

 在  src/backend/utils/adt/myfuncs.c 中實現(xiàn)函數(shù)

Datum  timezone_convert(PG_FUNCTION_ARGS) { Timestamp timestamp = PG_GETARG_TIMESTAMP(0); int32 zone1 = PG_GETARG_INT32(1); int32 zone2 = PG_GETARG_INT32(2);    Timestamp result = 0; if (!((1 <= zone1 && zone1 <= 24) && (1 <= zone2 && zone2 <= 24))) {  ereport(ERROR,  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),  errmsg("timestamp out of range.the parameter is 1..24"))); }  if (TIMESTAMP_NOT_FINITE(timestamp)) {  PG_RETURN_TIMESTAMP(timestamp); } /** 實現(xiàn)時區(qū)轉(zhuǎn)換 **/ PG_RETURN_TIMESTAMP(result); }

獲取參數(shù)判斷合法性

思路:

Timestamp timestamp = PG_GETARG_TIMESTAMP(0);timestamp -> day; timestamp -> hour;hour = hour + zone2 - zone1;hour >= 24  hour -= 24;  day += 1;hour < 0  hour += 24;  day -= 1;return timestamp;src/include/pgtime.h 定義了相關(guān)結(jié)構(gòu)體struct pg_tm{ int  tm_sec;     int  tm_min; int  tm_hour; int  tm_mday;    /* 1..31 */ int  tm_mon;  /* origin 0, not 1 */ int  tm_year; /* relative to 1900 */ int  tm_wday;    /* 0..6 (0是周一)*/ int  tm_yday;    /* 1..366 Julian date */ int  tm_isdst; long int tm_gmtoff; const char *tm_zone;};

/src/include/utils/timestamp.h

定義了timestamp 和 pg_tm 的轉(zhuǎn)換方法

extern int tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt);extern int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm, fsec_t *fsec, const char **tzn, pg_tz *attimezone);

timestamp2tm() 第一個參數(shù)是輸入timestamp,第三個是輸出pg_tm,第四個是輸出的小數(shù)秒,其他幾個參數(shù)與時區(qū)相關(guān),第2,5個參數(shù)也是出參,最后一個設(shè)置NULL就可以,表示當(dāng)前會話時區(qū)。

流程:

代碼:

Datum timezone_convert(PG_FUNCTION_ARGS){ Timestamp timestamp = PG_GETARG_TIMESTAMP(0); int32 zone1 = PG_GETARG_INT32(1); int32 zone2 = PG_GETARG_INT32(2); struct pg_tm tt, *tm = &tt; int day; fsec_t   fsec; Timestamp result = 0; if (!((1 <= zone1 && zone1 <= 24) && (1 <= zone2 && zone2 <= 24))) { ereport(ERROR,  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),  errmsg("timestamp out of range.the parameter is 1..24"))); }  if (TIMESTAMP_NOT_FINITE(timestamp)) { PG_RETURN_TIMESTAMP(timestamp); } if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0) { ereport(ERROR,  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),  errmsg("timestamp out of range"))); }  day = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday); tm->tm_hour = tm->tm_hour + zone2 - zone1; if(tm->tm_hour >= 24) { tm->tm_hour -= 24; day += 1; } else if(tm->tm_hour < 0) { tm->tm_hour += 24; day -= 1; } j2date(day, &tm->tm_year, &tm->tm_mon, &tm->tm_mday); if (tm2timestamp(tm, fsec, NULL, &result) != 0) { ereport(ERROR,  (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),  errmsg("timestamp out of range"))); } PG_RETURN_TIMESTAMP(result);}

 以上就是C語言時區(qū)轉(zhuǎn)換的函數(shù)實現(xiàn),如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 奉化市| 噶尔县| 交口县| 四川省| 萍乡市| 房产| 齐齐哈尔市| 达日县| 崇信县| 三门县| 微山县| 贵南县| 裕民县| 烟台市| 海伦市| 彰武县| 南和县| 道真| 南部县| 修水县| 江城| 敦化市| 美姑县| 泸定县| 龙门县| 榕江县| 雅江县| 南川市| 安阳县| 蓬溪县| 确山县| 诏安县| 三台县| 祁东县| 凤阳县| 锦屏县| 昌江| 河源市| 安化县| 珠海市| 财经|