C语言实现时区转换函数的实例

 更新时间:2017年08月11日 10:28:38   作者:yonj1e  
这篇文章主要介绍了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语言时区转换的函数实现,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 详解C++-(=)赋值操作符、智能指针编写

    详解C++-(=)赋值操作符、智能指针编写

    C++的智能指针是克服C++大坑的非常有用的的手段,之所以说它智能,是因为它为程序员克服了重要的编程问题——悬挂指针,下面通过本文给大家分享C++-(=)赋值操作符、智能指针编写,感兴趣的朋友一起看看吧
    2018-03-03
  • C++ cin速度优化详解

    C++ cin速度优化详解

    这篇文章主要介绍了C++ cin速度优化详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解

    C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解

    大家好,本篇文章主要讲的是C语言字符串函数操作(strlen,strcpy,strcat,strcmp)详解,感兴趣的同学赶快来看一看吧
    2021-12-12
  • 函数外初始化与函数内初始化详细解析

    函数外初始化与函数内初始化详细解析

    函数内初始化:bool FillStr(char *&szDst, int nSize);第一个参数中的&一定不能少,这是因为在函数外部我们只声明了这个指针,具体这个指针指向内存中的哪个地址我们并不知道,所以&是为了说明传递的是这个指针的引用,那么在函数内初始化后这个指针的地址也就是外面指针的地址了
    2013-09-09
  • 浅谈C++的几种从键盘输入方式

    浅谈C++的几种从键盘输入方式

    今天小编就为大家分享一篇浅谈C++的几种从键盘输入方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 详解如何在VS2019和VScode中配置C++调用python接口

    详解如何在VS2019和VScode中配置C++调用python接口

    这篇文章主要介绍了详解如何在VS2019和VScode中配置C++调用python接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C++算法之海量数据处理方法的总结分析

    C++算法之海量数据处理方法的总结分析

    本篇文章是对海量数据处理方法进行了详细的总结与分析,需要的朋友参考下
    2013-05-05
  • C语言中6组指针和自增运算符结合方式的运算顺序问题

    C语言中6组指针和自增运算符结合方式的运算顺序问题

    本文通过代码实现分析了6种组合:* p++,(* p)++,* (p++),++* p,++( * p), * (++p),需要的朋友可以参考下
    2015-07-07
  • C++基础之this指针与另一种“多态”

    C++基础之this指针与另一种“多态”

    this指针识别了同一个类的不同的对象,换句话说,this指针使得成员函数可以访问同一个类的不同对象。再深入一点,this指针使得成员函数会因为this指针的不同而访问到了不同的成员变量
    2013-07-07
  • 求子数组最大和的解决方法详解

    求子数组最大和的解决方法详解

    本篇文章是对求子数组最大和的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论