全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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语言中strlen() strcpy() strcat() strcmp()函数的实现方法  # C语言数据结构 快速排序实例详解  # C语言实现俄罗斯方块小游戏  # C语言模式实现C++继承和多态的实例代码  # C语言实现查看进程是否存在的方法示例  # 几个  # 第一个  # 如有  # 希望能  # 第三个  # 谢谢大家  # 转换成  # 可为  # 就可以  # 疑问请  # myfuncs  # adt  # PG_GETARG_TIMESTAMP  # PG_FUNCTION_ARGS  # Timestamp  # Datum  # DESCR  # utils  # backend  # convert 


相关文章: 魔方云NAT建站如何实现端口转发?  如何在阿里云完成域名注册与建站?  如何通过FTP空间快速搭建安全高效网站?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  如何选择PHP开源工具快速搭建网站?  如何在宝塔面板中创建新站点?  定制建站策划方案_专业建站与网站建设方案一站式指南  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  如何通过多用户协作模板快速搭建高效企业网站?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  广德云建站网站建设方案与建站流程优化指南  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  XML的“混合内容”是什么 怎么用DTD或XSD定义  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  如何通过WDCP绑定主域名及创建子域名站点?  如何快速搭建高效香港服务器网站?  大型企业网站制作流程,做网站需要注册公司吗?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何高效生成建站之星成品网站源码?  建站之星如何优化SEO以实现高效排名?  建站之星展会模板:智能建站与自助搭建高效解决方案  详解jQuery中基本的动画方法  如何用VPS主机快速搭建个人网站?  建站168自助建站系统:快速模板定制与SEO优化指南  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  网站制作大概多少钱一个,做一个平台网站大概多少钱?  购物网站制作公司有哪些,哪个购物网站比较好?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何高效配置IIS服务器搭建网站?  如何快速重置建站主机并恢复默认配置?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  潮流网站制作头像软件下载,适合母子的网名有哪些?  建站之星后台密码如何安全设置与找回?  安云自助建站系统如何快速提升SEO排名?  如何在万网ECS上快速搭建专属网站?  如何撰写建站申请书?关键要点有哪些?  如何快速生成橙子建站落地页链接?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  建站主机如何选?高性价比方案全解析  如何在万网开始建站?分步指南解析  如何通过VPS搭建网站快速盈利?  建站之星Pro快速搭建教程:模板选择与功能配置指南  宝塔面板如何快速创建新站点?  如何快速搭建高效WAP手机网站?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  高端企业智能建站程序:SEO优化与响应式模板定制开发  北京企业网站设计制作公司,北京铁路集团官方网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。