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小时内与您取得联系。