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

发布时间 - 2026-01-11 02:44:51    点击率:

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 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Android使用GridView实现日历的简单功能  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  JS实现鼠标移上去显示图片或微信二维码  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  如何用已有域名快速搭建网站?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  网站制作企业,网站的banner和导航栏是指什么?  JavaScript模板引擎Template.js使用详解  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  JS经典正则表达式笔试题汇总  Bootstrap CSS布局之列表  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  🚀拖拽式CMS建站能否实现高效与个性化并存?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  js实现获取鼠标当前的位置  如何在腾讯云服务器上快速搭建个人网站?  高防服务器租用如何选择配置与防御等级?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel如何配置和使用缓存?(Redis代码示例)  linux top下的 minerd 木马清除方法  Laravel如何处理CORS跨域请求?(配置示例)  ,在苏州找工作,上哪个网站比较好?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  浅析上传头像示例及其注意事项  java中使用zxing批量生成二维码立牌  如何在万网利用已有域名快速建站?  大同网页,大同瑞慈医院官网?  如何用狗爹虚拟主机快速搭建网站?  iOS正则表达式验证手机号、邮箱、身份证号等  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Linux系统运维自动化项目教程_Ansible批量管理实战  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  百度浏览器如何管理插件 百度浏览器插件管理方法  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  个人摄影网站制作流程,摄影爱好者都去什么网站?  网站页面设计需要考虑到这些问题  Bootstrap整体框架之CSS12栅格系统  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  如何用5美元大硬盘VPS安全高效搭建个人网站?  Android实现代码画虚线边框背景效果  如何在万网主机上快速搭建网站?  JavaScript常见的五种数组去重的方式  如何在阿里云虚拟服务器快速搭建网站?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何在云主机快速搭建网站站点?