更新时间:2026-07-28 GMT+08:00
日期、时间戳与区间解析
此示例使用库函数对时间和日期类型进行不同操作。具体使用方式请参见使用库函数章节。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <pgtypes_date.h>
#include <pgtypes_timestamp.h>
char *dates[] = { "19990108foobar",
"19990108 foobar",
"1999-01-08 foobar",
"January 8, 1999",
"1999-01-08",
"1/8/1999",
"1/18/1999",
"01/02/03",
"1999-Jan-08",
"Jan-08-1999",
"08-Jan-1999",
"99-Jan-08",
"08-Jan-99",
"08-Jan-06",
"Jan-08-99",
"19990108",
"990108",
"1999.008",
"J2451187",
"January 8, 99 BC",
NULL
};
/* 不可与libc的“times”冲突 */
static char *times[] = { "0:04",
"1:59 PDT",
"13:24:40 -8:00",
"13:24:40.495+3",
NULL
};
char *intervals[] = { "1 minute",
"1 12:59:10",
"2 day 12 hour 59 minute 10 second",
"1 days 12 hrs 59 mins 10 secs",
"1 days 1 hours 1 minutes 1 seconds",
"1 year 59 mins",
"1 year 59 mins foobar",
NULL
};
int main(void)
{
EXEC SQL BEGIN DECLARE SECTION;
date date1;
timestamp ts1, ts2;
char *text;
interval *i1;
date *dc;
EXEC SQL END DECLARE SECTION;
int i, j;
char *endptr;
/* 从文本中解析一个时间戳并将日期转换成字符串 */
ts1 = PGTYPEStimestamp_from_asc("2003-12-04 17:34:29", NULL);
text = PGTYPEStimestamp_to_asc(ts1);
printf("timestamp: %s\n", text);
free(text);
/* 从时间戳中抽取日期部分 */
date1 = PGTYPESdate_from_timestamp(ts1);
dc = PGTYPESdate_new();
*dc = date1;
/* 返回一个日期变量的文本表达 */
text = PGTYPESdate_to_asc(*dc);
printf("Date of timestamp: %s\n", text);
free(text);
PGTYPESdate_free(dc);
for (i = 0; dates[i]; i++)
{
bool err = false;
/* 从日期的文本表达解析一个日期 */
date1 = PGTYPESdate_from_asc(dates[i], &endptr);
if (date1 == INT_MIN) {
err = true;
}
/* 返回一个日期变量的文本表达 */
text = PGTYPESdate_to_asc(date1);
printf("Date[%d]: %s (%c - %c)\n",
i, err ? "-" : text,
endptr ? 'N' : 'Y',
err ? 'T' : 'F');
free(text);
if (!err)
{
for (j = 0; times[j]; j++)
{
int length = strlen(dates[i]) + 1 + strlen(times[j]) + 1;
char* t = (char *)malloc(length);
sprintf(t, "%s %s", dates[i], times[j]);
/* 从文本中解析一个时间戳并将日期转换成字符串 */
ts1 = PGTYPEStimestamp_from_asc(t, NULL);
text = PGTYPEStimestamp_to_asc(ts1);
if (i != 19 || j != 3)
printf("TS[%d,%d]: %s\n", i, j, errno ? "-" : text);
free(text);
free(t);
}
}
}
/* 从文本中解析一个时间戳 */
ts1 = PGTYPEStimestamp_from_asc("2004-04-04 23:23:23", NULL);
for (i = 0; intervals[i]; i++)
{
interval *ic;
/* 从文本中解析一个区间 */
i1 = PGTYPESinterval_from_asc(intervals[i], &endptr);
if (*endptr)
printf("endptr set to %s\n", endptr);
if (!i1)
{
printf("Error parsing interval %d\n", i);
continue;
}
/* 把一个区间变量加到时间戳变量上 */
j = PGTYPEStimestamp_add_interval(&ts1, i1, &ts2);
if (j < 0)
continue;
/* 将一个区间类型变量转换成文本格式 */
text = PGTYPESinterval_to_asc(i1);
printf("interval[%d]: %s\n", i, text ? text : "-");
free(text);
/* 返回一个已分配区间变量的指针 */
ic = PGTYPESinterval_new();
/* 复制一个区间类型的变量 */
PGTYPESinterval_copy(i1, ic);
/* 将一个区间类型变量转换成文本格式 */
text = PGTYPESinterval_to_asc(i1);
printf("interval_copy[%d]: %s\n", i, text ? text : "-");
free(text);
/* 释放已经分配区间变量的内存 */
PGTYPESinterval_free(ic);
PGTYPESinterval_free(i1);
}
return (0);
} 运行结果如下:
Date of timestamp: 2003-12-04 Date[0]: - (N - T) Date[1]: - (N - T) Date[2]: - (N - T) Date[3]: 1999-01-08 (N - F) TS[3,0]: 1999-01-08 00:04:00 TS[3,1]: 1999-01-08 01:59:00 TS[3,2]: 1999-01-08 13:24:40 TS[3,3]: 1999-01-08 13:24:40.495 Date[4]: 1999-01-08 (N - F) TS[4,0]: 1999-01-08 00:04:00 TS[4,1]: 1999-01-08 01:59:00 TS[4,2]: 1999-01-08 13:24:40 TS[4,3]: 1999-01-08 13:24:40.495 Date[5]: 1999-01-08 (N - F) TS[5,0]: 1999-01-08 00:04:00 TS[5,1]: 1999-01-08 01:59:00 TS[5,2]: 1999-01-08 13:24:40 TS[5,3]: 1999-01-08 13:24:40.495 Date[6]: 1999-01-18 (N - F) TS[6,0]: 1999-01-18 00:04:00 TS[6,1]: 1999-01-18 01:59:00 TS[6,2]: 1999-01-18 13:24:40 TS[6,3]: 1999-01-18 13:24:40.495 Date[7]: 2003-01-02 (N - F) TS[7,0]: 2003-01-02 00:04:00 TS[7,1]: 2003-01-02 01:59:00 TS[7,2]: 2003-01-02 13:24:40 TS[7,3]: 2003-01-02 13:24:40.495 Date[8]: 1999-01-08 (N - F) TS[8,0]: 1999-01-08 00:04:00 TS[8,1]: 1999-01-08 01:59:00 TS[8,2]: 1999-01-08 13:24:40 TS[8,3]: 1999-01-08 13:24:40.495 Date[9]: 1999-01-08 (N - F) TS[9,0]: 1999-01-08 00:04:00 TS[9,1]: 1999-01-08 01:59:00 TS[9,2]: 1999-01-08 13:24:40 TS[9,3]: 1999-01-08 13:24:40.495 Date[10]: 1999-01-08 (N - F) TS[10,0]: 1999-01-08 00:04:00 TS[10,1]: 1999-01-08 01:59:00 TS[10,2]: 1999-01-08 13:24:40 TS[10,3]: 1999-01-08 13:24:40.495 Date[11]: 1999-01-08 (N - F) TS[11,0]: 1999-01-08 00:04:00 TS[11,1]: 1999-01-08 01:59:00 TS[11,2]: 1999-01-08 13:24:40 TS[11,3]: 1999-01-08 13:24:40.495 Date[12]: 1999-01-08 (N - F) TS[12,0]: 1999-01-08 00:04:00 TS[12,1]: 1999-01-08 01:59:00 TS[12,2]: 1999-01-08 13:24:40 TS[12,3]: 1999-01-08 13:24:40.495 Date[13]: 2006-01-08 (N - F) TS[13,0]: 2006-01-08 00:04:00 TS[13,1]: 2006-01-08 01:59:00 TS[13,2]: 2006-01-08 13:24:40 TS[13,3]: 2006-01-08 13:24:40.495 Date[14]: 1999-01-08 (N - F) TS[14,0]: 1999-01-08 00:04:00 TS[14,1]: 1999-01-08 01:59:00 TS[14,2]: 1999-01-08 13:24:40 TS[14,3]: 1999-01-08 13:24:40.495 Date[15]: 1999-01-08 (N - F) TS[15,0]: 1999-01-08 00:04:00 TS[15,1]: 1999-01-08 01:59:00 TS[15,2]: 1999-01-08 13:24:40 TS[15,3]: 1999-01-08 13:24:40.495 Date[16]: 1999-01-08 (N - F) TS[16,0]: 1999-01-08 00:04:00 TS[16,1]: 1999-01-08 01:59:00 TS[16,2]: 1999-01-08 13:24:40 TS[16,3]: 1999-01-08 13:24:40.495 Date[17]: 1999-01-08 (N - F) TS[17,0]: 1999-01-08 00:04:00 TS[17,1]: 1999-01-08 01:59:00 TS[17,2]: 1999-01-08 13:24:40 TS[17,3]: 1999-01-08 13:24:40.495 Date[18]: 1999-01-08 (N - F) TS[18,0]: 1999-01-08 00:04:00 TS[18,1]: 1999-01-08 01:59:00 TS[18,2]: 1999-01-08 13:24:40 TS[18,3]: 1999-01-08 13:24:40.495 Date[19]: 0099-01-08 BC (N - F) TS[19,0]: 0099-01-08 00:04:00 BC TS[19,1]: 0099-01-08 01:59:00 BC TS[19,2]: 0099-01-08 13:24:40 BC interval[0]: @ 1 min interval_copy[0]: @ 1 min interval[1]: @ 1 day 12 hours 59 mins 10 secs interval_copy[1]: @ 1 day 12 hours 59 mins 10 secs interval[2]: @ 2 days 12 hours 59 mins 10 secs interval_copy[2]: @ 2 days 12 hours 59 mins 10 secs interval[3]: @ 1 day 12 hours 59 mins 10 secs interval_copy[3]: @ 1 day 12 hours 59 mins 10 secs interval[4]: @ 1 day 1 hour 1 min 1 sec interval_copy[4]: @ 1 day 1 hour 1 min 1 sec interval[5]: @ 1 year 59 mins interval_copy[5]: @ 1 year 59 mins Error parsing interval 6
父主题: 典型应用开发示例