문제

나는 노력하고있다 DateTime.TryParseExact 방법, 그리고 나는 방금 얻지 못하는 경우를 겪었습니다. 나는 각각이 형식 중 하나와 완벽하게 일치해야한다는 몇 가지 형식과 몇 가지 주제를 구문 분석해야합니다.

var formats = new[]
     {
         "%H",
         "HH",
         "Hmm",
         "HHmm",
         "Hmmss",
         "HHmmss",
     };

var subjects = new[]
     {
         "1",
         "12",
         "123",
         "1234",
         "12345",
         "123456",
     };

그런 다음 모두 구문 분석하고 결과를 인쇄하려고합니다.

foreach(var subject in subjects)
{
    DateTime result;
    DateTime.TryParseExact(subject, formats, 
        CultureInfo.InvariantCulture, 
        DateTimeStyles.NoCurrentDateDefault,
        out result);

    Console.WriteLine("{0,-6} : {1}", 
        subject,
        result.ToString("T", CultureInfo.InvariantCulture));
}

나는 다음을 얻는다 :

1      : 01:00:00
12     : 12:00:00
123    : 00:00:00
1234   : 12:34:00
12345  : 00:00:00
123456 : 12:34:56

그리고 내 질문에 ... 123과 12345에서 왜 실패합니까? 그것들이 01:23:00과 01:23:45가되어서는 안됩니까? 내가 여기서 무엇을 놓치고 있습니까? 그리고 내가 기대할 때 어떻게 작동하도록 할 수 있습니까?


업데이트: 그래서, 우리가 이것이 왜 실패했는지 알아 낸 것 같습니다. 그런 것 같습니다 H 실제로 두 자리를 잡고 하나만 남겨두고 있습니다. mm, 그런 다음 실패합니다. 그러나 누구든지 내가 찾고있는 결과를 얻을 수 있도록이 코드를 변경할 수있는 방법에 대해 좋은 아이디어를 가지고 있습니까?

다른 업데이트 : 지금 합리적인 솔루션을 찾았다 고 생각합니다. 답으로 추가했습니다. 다른 사람이 더 나은 것을 생각해 내지 않는 한 2 일 안에 그것을 받아 들일 것입니다. 도와 주셔서 감사합니다!

도움이 되었습니까?

해결책

좋아, 그래서 나는 더 많은 독서, 실험 및 다른 유용한 답변 덕분에 지금이 모든 것을 알아 냈다고 생각합니다. 일어나는 일은 그게됩니다 시간, 그리고 에스 실제로 나머지 형식에 대해 충분한 숫자가 없더라도 실제로 두 자리 숫자를 가져옵니다. 예를 들어 형식으로 그리고 숫자 123, 시간 잡을 것입니다 12 그리고 단지 만있을 것입니다 3 왼쪽. 그리고 mm 두 자리가 필요하므로 실패합니다. Tadaa.

따라서 내 솔루션은 현재 다음 세 가지 형식 만 사용해야합니다.

var formats = new[]
    {
        "%H",
        "Hm",
        "Hms",
    };

내 질문의 나머지 코드가 동일하게 유지되면 결과적으로 이것을 얻을 것입니다.

1      : 01:00:00
12     : 12:00:00
123    : 12:03:00
1234   : 12:34:00
12345  : 12:34:05
123456 : 12:34:56

내가 합리적이고 받아 들일 수 있어야한다고 생각합니다 :)

다른 팁

0123 012345

나는 그것이 그런 숫자를 찾을 때 2/4/6의 길이를 찾는 것 같아요. 123은 AM 또는 PM이어야합니까? 0123은 모호하지 않습니다.

사용자 정의 형식 패턴으로 날짜 또는 시간 분리기를 사용하지 않으면 제공자 매개 변수의 불변 배양과 각 사용자 정의 형식 지정자의 가장 넓은 형태를 사용하십시오. 예를 들어 패턴에서 시간을 지정하려면 더 좁은 형태 인 "H"대신 더 넓은 형태의 "HH"를 지정하십시오.

인용하다:http://msdn.microsoft.com/en-us/library/ms131044.aspx

다른 사람들이 지적했듯이 H는 10 시간을 의미하기 때문에 모호합니다. HH는 12 일입니다.

MSDN의 인용 단일 사용자 정의 형식 지정자 사용:

사용자 정의 날짜 및 시간 형식 문자열은 둘 이상의 문자로 구성됩니다. 예를 들어, 형식 문자열이 지정자 h로만 구성되면 형식 문자열은 표준 날짜 및 시간 형식 지정자로 해석됩니다. 그러나이 특별한 경우에는 H 표준 날짜 및 시간 형식 지정자가 없기 때문에 예외가 발생합니다.

단일 사용자 정의 날짜 및 시간 형식 지정자를 사용하려면 날짜 및 시간 지정자 전후 공간을 포함 시키거나 단일 사용자 정의 날짜 및 시간 지정자 앞에 백분율 (%) 형식 지정자를 포함하십시오. 예를 들어, 형식 문자열 "H"및 "%h"는 현재 날짜 및 시간 값으로 표시되는 시간을 표시하는 사용자 정의 날짜 및 시간 형식 문자열로 해석됩니다. 공간이 사용되면 결과 문자열에서 문자 문자로 나타납니다.

그래서 그랬어야 했어 % H 첫 번째 요소에서 formats 정렬?

이것이 도움이되기를 바랍니다.

나는 틀릴 수 있지만, 형식 문자열의 "h"부분에 내재 된 모호성과 관련이 있다고 생각합니다. 즉, 문자열 "123"이 주어지면 시간 "1"(01 : 00) 또는 시간 "12"(12:00); 이후 TryParseExact 어느 것이 옳은지 알지 못하고 거짓을 반환합니다.

이 메소드가 "최상의 추측"을 제공하지 않는 이유에 관해서는 다음과 같습니다. 문서는 이것에 대해 당신의 편이 아닙니다. 두려워합니다. 로부터 DateTime.tryParse의 MSDN 문서 (강조 광산) :

이 메소드가 돌아 오면 DateTime 포함 된 날짜와 시간에 해당합니다 에스, 전환이 성공하면 또는 DateTime.MinValue 변환이 실패한 경우. 어느 쪽이든 변환이 실패합니다 에스 또는 체재매개 변수입니다 null, 빈 문자열이거나, 지정된 패턴에 해당하는 날짜와 시간이 포함되어 있지 않습니다. 체재. 이 매개 변수는 초기화되지 않은 전달됩니다.

"123"과 "12345"는 tryparseexact 방법과 관련하여 모호한 것처럼 보입니다. "12345"는 예를 들어 12:34:50 또는 01:23:45 일 수 있습니다. 그래도 추측.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top