-
问题描述
自定义一个DateTime结构体,代码如下:
//定义DateTime结构体
struct DateTime
{
short year;
short month;
short day;
short hour;
short minute;
short second;
};
如何将DateTime对象转换成形如“YYYY-MM-DD hh:mm:ss”的字符串格式,或者用该字符串来给DateTime对象赋值,以方便比较时间。
-
解决方案
定义一个转换函数,将字符串转换为DateTime结构体,代码如下:
//接受3个参数,分别为字符串首地址,起始位置,计算长度
short SubStringToShort(const char *str, int begin, int len)
{
int res = 0;
for (int i = begin; i < begin+len; ++i)
{
int tmp = str[i] - '0'; //将字符型转化为整型
res *= 10;
res += tmp;
}
return (short)res;
}
//将字符串转换为DateTime结构体
DateTime *StringToDateTime(const char *str)
{
DateTime *dt = new DateTime();
//字符串必须符合特定格式(YYYY-MM-DD hh:mm:ss)
int len = strlen(str);
if (len != 19)
{
cout << "Invalid time string: " << str << endl;
return nullptr;
}
//给year成员赋值
short *p = (short *)dt + 1;
dt->year = SubStringToShort(str, 0, 4);
for (int i = 0; i < 5; ++i)
{
//给DateTime剩余的成员赋值,以short指针类型后移来获取成员内存地址
*(p+i) = SubStringToShort(str, 5+i*3, 2);
}
return dt;
}
将DateTime结构体转换为字符串,代码如下:
//将DateTime结构体转换为字符串
char *DateTimeToString(const DateTime *dt)
{
char *str = new char[19];
//使用sprintf库函数,格式化字符串,注意格式控制符的使用
sprintf(str, "%04d-%02d-%02d %02d:%02d:%02d", dt->year, dt->month, dt->day,
dt->hour, dt->minute, dt->second);
return str;
}
-
总结
本解决方案较为简单,需要特定的字符串格式方可。
通常情况下,本例中的DateTime结构体因成员变量均为short类型,故依次在内存中排序方式从低字节向高字节进行,就可以使用short指针递增的方式来获取各个成员变量的地址,并进行赋值。