C語言實現(xiàn)時區(qū)轉換函數(shù)的實例
C語言實現(xiàn)時區(qū)轉換函數(shù)的實例
時區(qū)轉換函數(shù)
功能:
把時區(qū)1的時間轉換成時區(qū)2的時間
參數(shù):
arg1 -- 輸入時間
arg2 -- 時區(qū)1(也是arg1當前時間所在的時區(qū))
arg3 -- 時區(qū)2(要轉換的時區(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ū)轉換 **/
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 定義了相關結構體
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() 第一個參數(shù)是輸入timestamp,第三個是輸出pg_tm,第四個是輸出的小數(shù)秒,其他幾個參數(shù)與時區(qū)相關,第2,5個參數(shù)也是出參,最后一個設置NULL就可以,表示當前會話時區(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ū)轉換的函數(shù)實現(xiàn),如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
在C語言中對utmp文件進行查找和寫入操作的函數(shù)小結
這篇文章主要介紹了在C語言中對utmp文件進行查找和寫入操作的函數(shù)小結,包括pututline()函數(shù)和getutline()函數(shù)以及getutid()函數(shù),需要的朋友可以參考下2015-08-08
如何通過函數(shù)指針調用函數(shù)(實現(xiàn)代碼)
指針可以不但可以指向一個整形,浮點型,字符型,字符串型的變量,也可以指向相應的數(shù)組,而且還可以指向一個函數(shù)2013-09-09

