您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何在C語言中自定義一個時區轉換函數,此處通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下:
C語言實現時區轉換函數的實例
時區轉換函數
功能:
把時區1的時間轉換成時區2的時間
參數:
arg1 -- 輸入時間
arg2 -- 時區1(也是arg1當前時間所在的時區)
arg3 -- 時區2(要轉換的時區的時間)
要求:
參數arg1類型可為timestamp
24個時區(由1-24表示)
在 pg_proc.h 中添加函數定義
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 中實現函數
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); } /** 實現時區轉換 **/ PG_RETURN_TIMESTAMP(result); }
獲取參數判斷合法性
思路:
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 定義了相關結構體 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 的轉換方法
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() 第一個參數是輸入timestamp,第三個是輸出pg_tm,第四個是輸出的小數秒,其他幾個參數與時區相關,第2,5個參數也是出參,最后一個設置NULL就可以,表示當前會話時區。
流程:
代碼:
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語言中自定義一個時區轉換函數的文章就介紹到這了,更多相關內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。