2017-01-18 1 views
1

이 함수를 사용하여 DateTimeMM/DD/YYYY HH:MM:SS PM 형식으로 추출했습니다. 그럼 난 이제 변경되고 분석 된 엑셀 파일에 분할 할 수있는 문자는 전에 +DateTime을 구문 분석하는 함수

내가 걸릴 내 구문을 수정하려고 시도 반면 지금 중 하나 + 또는 -입니다

인수 1 : '문자'

경우 String.indexOf '에 가장 적합한 오버로드 된 메서드에'문자열 [] '에서 변환 할 수 없습니다 (문자 배열,하지만 그런 일을 내가 지금이 컴파일 에러를 얻을 char) '에 잘못된 인수가 있습니다.

문자 배열을 허용하려면 어떻게 업데이트해야합니까?

07/22/2016 05:22:00 PM + 00:00 
07/22/2016 12:00:00 AM - 04:00 

그리고 기능은 다음과 같습니다 : 함수에 전달 될

이 샘플 형식은

public static string FormatToUsableDateTime(string DateToConvert) 
{ 
    convertedDateTime = null; 
    var charstocheck = new[] 
    { 
     "+", 
     "-" 
    }; 
    int index = DateToConvert.IndexOf(charstocheck); 
    convertedDateTime = (index > 0 ? DateToConvert.Substring(0, index) : ""); 
    return convertedDateTime; 
} 
+0

'DateTime.ParseExact'를 사용하십시오. – Dai

답변

2

, 컴파일러는 "..."대신에 '의로 포장하여 (데이터를 넣어하는 방법과 판단, string[]로 지정합니다. .. ')

게다가, IndexOf은 그래서 당신이 입력으로 (이 string[] 또는 char[] 일) 배열을 넣을 수 없습니다하는 단일 문자를 확인합니다.

당신이 대신 할 수있는 것은 (+ 또는 -) 하는 문자를 확인하는 것입니다 string에 존재하고 사용한다는 점에서 당신의 IndexOf : 당신이 두 문자가 있기 때문에이 상황에 맞는

public static string FormatToUsableDateTime(string DateToConvert) 
{ 
    convertedDateTime = null; 
    char chartocheck = DateToConvert.Contains('+') ? '+' : '-'; 
    int index = DateToConvert.IndexOf(chartocheck); 
    convertedDateTime = (index > 0 ? DateToConvert.Substring(0, index) : ""); 
    return convertedDateTime; 
} 

확인하려면 + 또는 -. 당신은 확인하기 위해 더 많은 두 개의 문자가있는 경우 사용을 고려할 수 IndexOfAny

편집 :

BACON 패턴이 "-체크하면 존재"다음 "을 사용-경우-존재"로 지적 대부분의 경우 비효율적이며 그 점에 동의합니다. "check-and-use-if-exist"가 종종 더 나은 해결책입니다.상기 코드는 따라서보다 효율적인 솔루션의

int index = DateToConvert.IndexOf('+'); //guess what is more often to come 
if (index < 0) //if proven wrong, guess take the other 
    index = DateToConvert.IndexOf('-'); 

(베이컨 응답으로) IndexOfAny 대체하거나 할 수있다.

+0

내 코드보다 훨씬 청소기 완벽하게 작동, 감사합니다! –

+0

@MichaelMormon 당신은 매우 환영합니다. ;) – Ian

+0

'DateToConvert.Contains'는''+ ''를 찾거나 문자열의 끝에 도달 할 때까지''DateToConvert' 문자를 문자별로 스캔하지만''+''가 발견 된 곳은 기록하지 않습니다 그랬어. 그런 다음'DateToConvert.IndexOf'는'chartocheck'을 찾을 때까지 문자로'DateToConvert' 문자를 다시 스캔합니다 (이전 줄에 이미있는 '+'가 될 수도 있습니다). 이것은 매우 효율적인 방법은 아니며 코드를 더 쉽게 이해할 수는 없습니다. – BACON

2

당신은 IndexOfAny method 사용할 수 있습니다

var charstocheck = new[] 
{ 
    '+', 
    '-' 
}; 
int index = DateToConvert.IndexOfAny(charstocheck); 

주를이 IndexOfAny은이 아닌 char의 배열을 허용합니다.이므로 chartocheck의 유형을 char[]으로 변경했습니다. 당신이 당신의 charstocheck 변수에 var를 사용하여 명시 적으로 데이터 형식을 명시하지 않기 때문에

+0

upvoted, 내 대답에 귀하의 의견을 – Ian

1

때문입니다. IndexOf() 메서드는 오버로드 된 옵션이 9 개 있지만 아무도 입력 매개 변수로 문자열 배열을 수락하지 않습니다. 뜻이 유니 코드 문자의 지정된 배열에 모든 문자의 인스턴스에서 처음 나타나는 인덱스 (0부터 시작)를 반환

int index = DateToConvert.IndexOfAny(charstocheck); 

: 당신이 그런 짓을해야합니다. 그러나이 경우에는이 같은 문자 배열에 문자열 배열에서 charstocheck을 변경해야합니다 :

var charstocheck = new[] { '+', '-' }; 
+0

단순히 큰 따옴표에서 작은 따옴표로 변경하면 사용할 수있는 입력으로 바뀝니다 (이 경우 문자열에서 char로 변경)? –

+0

'IndexOf' 대신에'IndexOfAny'를 사용하고 strin을 바꾸는 방법 g 문자열을 char로 변경하여 문자 배열에 배열 –

+0

[9 IndexOf' overloads] (https://msdn.microsoft.com/library/system.string.indexof.aspx)는'string' 클래스에 정의되어 있으며 확장 방법은 아니지만 그렇지 않은 경우 올바른 방법입니다. – BACON

1

당신은 +00:00 사이의 공간이 날짜 즉, 내가 해낸 문제가 + 00:00입니다 07/22/2016 05:22:00 PM + 00:00 보면 그래서 우리가 그 공간을 제거하면 정확한 날짜를 다음과 같은 문자열에서 파싱 할 수 있습니다.

string smdt = "07/22/2016 05:22:00 PM + 00:00"; 
//Find the character. if it is + or - 
string chartocheck = smdt.Contains("+") ? "+" : "-"; 
//Remove the space between the +/- and time 
string Correctedsmdt = smdt.Replace(chartocheck + " ", chartocheck); 
//This is the string format which is going to parse the Date 
string format = "MM/dd/yyyy h:mm:ss tt zzz"; 
DateTime dt = DateTime.ParseExact(Correctedsmdt, format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); 
관련 문제