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传递给前端【方法】
如何在云主机快速搭建网站站点?

