全网整合营销服务商

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

免费咨询热线: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 


相关文章: 建站之星CMS五站合一模板配置与SEO优化指南  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何确保FTP站点访问权限与数据传输安全?  北京制作网站的公司,北京铁路集团官方网站?  微信小程序 input输入框控件详解及实例(多种示例)  如何访问已购建站主机并解决登录问题?  电商网站制作公司有哪些,1688网是什么意思?  建站主机如何选?高性价比方案全解析  如何在橙子建站中快速调整背景颜色?  如何快速辨别茅台真假?关键步骤解析  如何在服务器上三步完成建站并提升流量?  如何快速搭建高效香港服务器网站?  宝塔建站无法访问?如何排查配置与端口问题?  如何用腾讯建站主机快速创建免费网站?  深圳 网站制作,深圳招聘网站哪个比较好一点啊?  如何选择CMS系统实现快速建站与SEO优化?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  建站之星安装后界面空白如何解决?  如何通过西部数码建站助手快速创建专业网站?  ,如何利用word制作宣传手册?  如何快速启动建站代理加盟业务?  建站之星如何助力企业快速打造五合一网站?  如何在云主机快速搭建网站站点?  如何在万网ECS上快速搭建专属网站?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何快速生成高效建站系统源代码?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  建站之星如何修改网站生成路径?  如何规划企业建站流程的关键步骤?  ,网页ppt怎么弄成自己的ppt?  简历在线制作网站免费版,如何创建个人简历?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  已有域名和空间如何快速搭建网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  ,在苏州找工作,上哪个网站比较好?  如何选择高效稳定的ISP建站解决方案?  定制建站价位费用解析与套餐推荐全攻略  建站之星安装模板失败:服务器环境不兼容?  MySQL查询结果复制到新表的方法(更新、插入)  定制建站是什么?如何实现个性化需求?  高性价比服务器租赁——企业级配置与24小时运维服务  C++中引用和指针有什么区别?(代码说明)  如何确保西部建站助手FTP传输的安全性?  如何在IIS7上新建站点并设置安全权限?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  网站按钮制作软件,如何实现网页中按钮的自动点击?  如何在阿里云ECS服务器部署织梦CMS网站? 

您的项目需求

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