DateTime結構體與字串相互轉換的程式碼實現
阿新 • • 發佈:2018-12-14
-
問題描述
自定義一個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指標遞增的方式來獲取各個成員變數的地址,並進行賦值。