中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在C語言中自定義一個時區轉換函數

發布時間:2021-02-22 17:53:08 來源:億速云 閱讀:406 作者:戴恩恩 欄目:編程語言

這篇文章主要介紹了如何在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就可以,表示當前會話時區。

流程:

如何在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);
 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語言中自定義一個時區轉換函數的文章就介紹到這了,更多相關內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉善县| 大竹县| 周宁县| 岑巩县| 井研县| 仪征市| 深水埗区| 巧家县| 滁州市| 二连浩特市| 岢岚县| 三亚市| 安义县| 巧家县| 逊克县| 即墨市| 临洮县| 皮山县| 农安县| 平湖市| 阿拉善左旗| 双桥区| 彭泽县| 上饶市| 望奎县| 肃南| 蓬溪县| 义马市| 辽中县| 玉树县| 蓬莱市| 和静县| 石台县| 科技| 揭阳市| 延寿县| 华蓥市| 河东区| 南溪县| 伊吾县| 翼城县|