public string ConvertDateInString(string filenameFormat, DateTime targetdate)
string filenameFormat에 "yymmdd_파일이름_yymmdd-1.xlsx"를 넘겨주면,
targetdate의 년월일의 숫자데이터로 변경한다.
return string은 변경된 이름이다.
(소문자 yy, mm, dd 또는 yyyy만 인식한다.)
/// 지정한 날짜 데이터의 숫자로 yy, mm ,dd 또는 yyyy를 replace 함. /// using System; namespace automating_system_report { class DateStringConverter { #region global var FindNumberInString fn = new FindNumberInString(); // source에서 숫자 부분을 검출, +나 - 기호의 뒤에 숫자가 위치하면, 날짜 데이터에 가감하기 위해 선언 #endregion global var ////// filenameFormat을 yy, dd, mm의 해당 문자열을 targetdate의 날짜 데이터로 바꿈 /// 파라미터 설명은 2012년 6월 26일을 예로 함. /// /// ex) yyyymmdd점검일지yy-mm-dd-1.xlsx /// ex)날짜 데이터(2012-06-26) ///ex) 20120626점검일지12-06-25.xlsx public string ConvertDateInString(string filenameFormat, DateTime targetdate) { fn.FindNumber(filenameFormat); DateTime convertedDate=targetdate; filenameFormat = RecursiveReplaceDate(filenameFormat, "dd", ref targetdate); //filenameFormat의 dd부분을 days로 변경 filenameFormat = RecursiveReplaceDate(filenameFormat, "mm", ref targetdate); //filenameFormat의 mm부분을 months로 변경 if(filenameFormat.LastIndexOf("yyyy")>-1) filenameFormat = RecursiveReplaceDate(filenameFormat, "yyyy", ref targetdate); //filenameFormat의 yyyy부분을 years로 변경 else if(filenameFormat.LastIndexOf("yy")>-1) filenameFormat = RecursiveReplaceDate(filenameFormat, "yy", ref targetdate); //filenameFormat의 yy부분을 years로 변경 if ((filenameFormat.IndexOf("yy")>-1) ||(filenameFormat.IndexOf("mm")>-1) ||(filenameFormat.IndexOf("dd")>-1) ) { filenameFormat=ConvertDateInString(filenameFormat,targetdate); } return filenameFormat; } public string RecursiveReplaceDate(string source, string repStr, ref DateTime convertedDate) { int whereIsrepStr=-1; // repStr이 있는 위치를 저장할 변수 int adjustLocPredication=-1; // repStr뒤에 +나 -로 조정할 기호가 있을 위치를 비교하기 위한 변수 int adjustVal=0; // +나 -로 조정할 기호가 있다면 조정할 수치 int adjustLength=0; // +나 - 기호부터 ~ 수치까지 길이 string dating=""; //년월일에 변경할 숫자 문자. string prestr; //숫자로 변경할 날짜부분의 앞 string poststr;//숫자로 변경할 날짜부분의 뒤 DateTime convertedDate;// targetdate에서 +,-로 변경한 날짜데이터. try { whereIsrepStr = source.LastIndexOf(repStr); //뒤에서부터 repStr을 검색, 위치를 기억 } catch { whereIsrepStr = -1; } //repStr을 source문자열에서 못찾을 경우 if (whereIsrepStr > -1)// 바꿀 대상인 repStr이 문자열에 있으면, 숫자로 변환하기 위해 아래를 수행 { adjustLocPredication = whereIsrepStr + repStr.Length; //adjustLocPredication는 문자열에서 repStr위치한 다음 칸 // 먼저 repStr뒤에 +나 - 기호의 조정자가 있는지 검색 foreach (FindNumberInString.NumberInStringSTRUCT n in fn.ListNumber) //filenameFormat의 숫자의 값과 위치를 담고 있는 ListNumber를 foreach { //Trace.WriteLine(n.StartIndex); if (n.StartIndex == adjustLocPredication + 1) //foreach수행한 요소마다 위치가 +, - 기호 뒤에 위치하는지 비교 { //(+,-기호 위치 바로 뒤에 오는 숫자는 날짜데이터에서 변경할 값으로 인식) adjustVal = Int32.Parse(n.NumberString); //adjustVal은 날짜에서 변경할 값 // +기호인지 -기호인지 확인 char[] sign = source.ToCharArray(); if (sign[adjustLocPredication] == '-') { adjustVal *= (-1); //음수 adjustLength=n.Length+1; } else if (sign[adjustLocPredication ] == '+') { adjustLength=n.Length+1; } else { adjustVal = 0; } // + , - 기호가 없으면 날짜에서 변경할 값이 아닌 일반 숫자로 받아들임 } } switch (repStr) //repStr의 종류에 따라 위에서 찾은 adjustVal만큼 조정후, 년월일에 해당하는 문자열을 substring { case "dd": convertedDate = targetdate.AddDays(adjustVal); dating = convertedDate.Date.ToString().Substring(8, 2); break; case "mm": convertedDate = targetdate.AddMonths(adjustVal); dating = convertedDate.Date.ToString().Substring(5, 2); break; case "yyyy": convertedDate = targetdate.AddYears(adjustVal); dating=convertedDate.Date.ToString().Substring(0,4); break; case "yy": convertedDate= targetdate.AddYears(adjustVal); dating=convertedDate.Date.ToString().Substring(2,2); break; } if (dating!="") { prestr = source.Substring(0, whereIsrepStr); //변경할 문자열을 제외한 앞부분 poststr = source.Substring(whereIsrepStr + repStr.Length + adjustLength);//변경할 문자열을 제외한 뒷부분 source = prestr + dating + poststr;//앞부분 + 날짜문자열 + 뒷부분을 다시 source에 저장 } } return source; } } } //
댓글 없음:
댓글 쓰기