1. 程式人生 > >DateTime結構體與字串相互轉換的程式碼實現

DateTime結構體與字串相互轉換的程式碼實現

  • 問題描述

自定義一個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指標遞增的方式來獲取各個成員變數的地址,並進行賦值。