2012-07-30 5 views
28

조금 이상합니다. 정확한 시도를하면 유효 기간으로 텍스트 필드를 파싱 할 수 없습니다!TimeSpan.ParseExact가 작동하지 않는 이유

const string tmp = "17:23:24"; 
//works 
var t1 = TimeSpan.Parse(tmp); 
//fails 
var t2 = TimeSpan.ParseExact(tmp, "hh:mm:ss", System.Globalization.CultureInfo.InvariantCulture); 

두 번째 구문 분석은 "입력 문자열이 올바른 형식이 아닙니다."예외로 실패합니다. DateTime에서.

+4

당신이 '필요 대신 hh' (24 시간 형식)'의 HH' – V4Vendetta

+0

: 당신은 같은 것을 할 전망 대답; 가능성이 큽니다. –

+0

날짜가 어디입니까? –

답변

59

documentation에서하십시오 포함

형식 문자열에 다른 이스케이프 문자를, 화이트 - 공백 문자는 interprete입니다. d를 사용자 지정 형식 지정자로 사용합니다. 대부분의 경우 이스케이프 처리되지 않은 문자가 있으면 FormatException이됩니다.

  • 작은 따옴표 (리터럴 문자열 구분 기호)로 묶 :

    는 형식 문자열에서 리터럴 문자를 포함하는 방법은 두 가지가 있습니다.

  • 앞에는 이스케이프 문자로 해석되는 백 슬래시 ("\")를 붙입니다. 즉, C#에서는 형식 문자열이 이어야하며 리터럴 문자 앞에 백 슬래시가 추가되어야합니다.

.NET Framework는 시간 간격이 [ ] 인 구분 기호에 대한 문법을 ​​정의하지 않습니다. 즉, 일 문자와 일 문자 사이의 구분 기호는 시간과 분, 분과 초 및 초와 초의 부분을 모두 형식 문자열의 문자 리터럴로 처리해야합니다.

그래서,이 솔루션은

TimeSpan.ParseExact(tmp, "hh\\:mm\\:ss", CultureInfo.InvariantCulture) 
+5

좋은 답변, 존 - 나는'ParseExact'가 포매터와 12/24 시간 관례를 무시한다는 것을 결코 깨닫지 못했다. –

+0

그래서 - 오늘 새로운 것을 배웠습니다! Parse는 분리 기호를 처리하지만 ParseExact는 처리하지 않습니다. – Quango

+0

'DataTable.Select()'의 Expression 문자열에서'string'을'TimeSpan'으로 변환하는 것과 관련된 문제를 해결할 수 있기를 바랬습니다. 그러나 운이 없다. 버그 [여기] (https://connect.microsoft.com/VisualStudio/feedback/details/806804/datatable-select-unable-to-convert-string-to-timespan-net-framework-4)에 제출했습니다. – Conrad

2

은 HH는 사용자 정의 시간 범위 형식 지정이 자리에게 같은 기호로 구분 기호를 포함하지 않는 TimeSpan

정말 아니라고 보인다 시간에서 별도의 일, 분 시간, 초 분 초. 대신이 기호는 맞춤 형식 문자열에 리터럴 문자열로 포함되어야합니다. 예를 들어 "dd.hh \ : mm"은 마침표 (.)를 으로 구분하고 요일과 시간을 구분 기호로 사용하며 구분 기호로는 을 시간과 분으로 구분합니다. 존은 를 사용하여 탈출 언급 한 바와 같이

따라서 올바른 방법은 "\"Read More

이 될 것입니다 귀하의 TimeSpan 인 24 시간 형식으로되어 "17시 23분 24초" 및 그것은 HH 형식을 사용하고 12 시간 형식의 경우는 hh이 아닌 파싱되어야합니다.

TimeSpan.ParseExact(tmp, "HH:mm:ss",System.Globalization.CultureInfo.InvariantCulture); 

체크 아웃 the formats

+0

관련 없음 : 요일의 일부로 간주되지 않는 시간의 지정자는'hh'입니다. – Jon

+0

@Jon 당신은 무엇을 의미합니까? – V4Vendetta

+1

[TimeSpan' 형식 문자열] (http://msdn.microsoft.com/en-us/library/ee372287)과 다른 'DateTime'형식 문자열에 연결하고 있습니다. – Jon

0

이 시도 :

 var t2 = TimeSpan.ParseExact(tmp, "HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); 
+0

답장을 보내 주셔서 감사합니다. 실제 문제에 대한 Jon의 답변을 참조하십시오. – Quango

8

는 시도로 형식 문자열을 지정하는 것입니다이 :

var t2 = TimeSpan.ParseExact(tmp, "c", System.Globalization.CultureInfo.InvariantCulture); 

출처 : Standard TimeSpan Format Strings

+0

답장을 보내 주셔서 감사합니다. 나는 분리 기호 문제를 처리하는 'c'형식을 발견하지 못했습니다 : 또 다른 새로운 것 배웠다! – Quango

2

당신이 거래를하지 않으려면 TimeSpan.ParseExactDateTime.ParseExact 사이의 형식 지정자의 차이점을 사용하면 세인트는 DateTime로 문자열을 구문 분석하고이 같은 TimeSpanTimeOfDay 구성 요소를 얻을 : V4Vendetta @

어쩌면
var t2 = DateTime.ParseExact(tmp, "hh:mm:ss", CultureInfo.InvariantCulture).TimeOfDay; 
+0

다른 방법으로 이동하는 방법은 [이 답변] (https://stackoverflow.com/a/2552455/696391)을 참조하십시오. DateTime 형식 지정자를 사용하여 TimeSpan을 형식화합니다. – samgak

관련 문제