MySQL 데이터베이스에 삽입 할 특정 형식으로 수신하는 날짜 - 시간을 변환하려고합니다. 이 프로그램은 C++로 작성되었으며 다음과 같은 솔루션이 작동하지만 엄청나게 비효율적이라고 생각합니다.문자열에서 정보를 토큰 화/추출하는 가장 좋은 방법
입력은 다음과 같습니다 월 11월 8일 17시 41분 23초 0000 2010
원하는 출력 형식은 다음과 같습니다 YYYY-MM-DD HH : MM : SS
그래서이 예제의 출력은 다음과 같습니다 2010- 11-08 17:41:23
본인은 관련 코드 부분을 포함 시켰습니다. 당신이 POSIX 시스템 (즉,하지 창)에있는 경우
//class variable
std::map<std::string, std::string> monthMap;
void processor::initializeMonthMap(){
monthMap["Jan"] = "01";
monthMap["Feb"] = "02";
monthMap["Mar"] = "03";
monthMap["Apr"] = "04";
monthMap["May"] = "05";
monthMap["Jun"] = "06";
monthMap["June"] = "06";
monthMap["Jul"] = "07";
monthMap["July"] = "07";
monthMap["Aug"] = "08";
monthMap["Sept"] = "09";
monthMap["Sep"] = "09";
monthMap["Oct"] = "10";
monthMap["Nov"] = "11";
monthMap["Dec"] = "12";
}
inline std::string processor::convertDate(std::string input) {
//Format: Mon Nov 08 17:41:23 +0000 2010
//To get to YYYY-MM-DD HH:MM:SS
std::stringstream newString(input);
std::string temp1;
std::string temp2;
// Read Day in txt, discard
newString >> temp1;
//Read month, convert to number
newString >> temp1;
temp2 = "-" + monthMap[temp1] + "-";
//Read Day in number
newString >> temp1;
temp2.append(temp1 + " ");
//Read TimeStamp
newString >> temp1;
temp2.append(temp1);
//Discard UTM adjustment
newString >> temp1;
//Read year
newString >> temp1;
//Add year to beginning of input
temp1.append(temp2);
return temp1;
}
당신은 정규식 (표준 : TR1 또는 부스트 : 정규식)를 사용하여 깨끗한 솔루션을 수 있습니다. 또한 형식이 표준 인 경우 Boost.Date_Time을 조사 할 수 있습니다. – anno
컴파일러 최적화 코드 실행을 측정 해 보셨습니까? 귀하의 코드는 매우 직관적입니다. 당신은 더 짜낼 수 있지만, 그만한 가치가 있습니까? 당신처럼 깨끗하고, 이해할 수 있고, 합리적으로 효율적인 코드는 가치가 있습니다. (방금 tempXXX의 이름을 적절한 이름으로 변경 한 경우 ...) –
일반적으로 @Peter에 동의합니다. 그러나이 경우, 날짜/시간 라이브러리를 사용하면이 코드를'get_date_from_string (..., format)'다음에'get_string_from_date (..., other_format)'라는 두 줄로 줄일 수 있습니다. 이것은 더 명확하고 간명 할 것입니다. – Tim