DateTime에서 false를 반환하지 않고 DateTime으로 인식되는 10 진수 값입니다.


9

날짜 또는 십진수인지 여부를 문자열 값을 기준으로 확인해야하지만 날짜 구문 분석은 항상 십진수에 대해 true를 반환합니다.

string val = "3.5";
DateTime oDate = DateTime.Parse(val);

유효한 날짜를 반환합니다 3/5/2019.

날짜 형식을 알 수없는 경우 유효한 날짜를 알기 위해 문자열을 확인하는 방법은 무엇입니까?


6
소수를 먼저 확인 하시겠습니까? 또는 DateTime.ParseExact어떤 형식을 취할 수 있는지 알고 있다면 사용 하십시오
A Friend

3
TryParseExact유효한 날짜 형식을 사용 하고 지정할 수 있습니다 .
juharr

5
실제로- DateTime.Parse여러 패턴을 시도합니다. 특정 것만 인식하려면 구체적으로 구문 분석하십시오.
Jon Skeet

1
이것이 귀하의 질문에 대답합니까? DateTime.TryParse
Joost K

답변:


3

"유효한 날짜를 알기 위해 문자열의 유효성을 검사하는 방법은 무엇입니까?"

문제는 유효한 날짜 (및 소수점) "3.5" 간주됩니다.

당신은 항상에 소수점 유형을 원하는 경우 (즉, 당신은 원하지 않는다 "승리" isDateisDecimal모두가 되실 true), 유효성 검사에서 소수 검사를 포함한다.

이를 수행하는 한 가지 방법 은 문자열을 유형으로 구문 분석 할 수 있고 매개 변수를 변환 된 값으로 설정하는 TryParse메소드 를 사용하여 bool문자열을 유형 out으로 변환 할 수 있는지 여부를 판별하는 것입니다.

string val = "3.5";

// temp variables to hold parsed values
DateTime tmpDate;
decimal tmpDec;
int tmpInt;

var isDecimal = decimal.TryParse(val, out tmpDec);
var isInteger = int.TryParse(val, out tmpInt);

// When checking if it's a DateTime, make sure it's not also a decimal
var isDate = !isDecimal && DateTime.TryParse(val, out tmpDate);

나는 이미 시도했지만 3.5는 유효한 날짜와 유효한 소수이므로 전혀 도움이되지 않습니다.
Munawar

1
위의 코드에서, isDatefalse은 수표를 포함하기 때문에 isDecimal. 그게 당신이 요구 한 것이 아닙니까?
Rufus L

2
@Munawar- "3.5는 유효한 날짜와 유효한 십진수"입니다. 인간으로서 우리에게 그 문자열이 제시되고 다른 문맥이 없다면, 그것이 날짜인지, 소수인지 또는 다른 것이 될 수 있는지 알 수 없습니다 . 컴퓨터가 마술처럼 대답 할 것이라고 기대할 수는 없습니다.
Damien_The_Unbeliever

예,이 답변은 문제에만 해당되며 형식을 알면 ParseExact가 가장 적합하지만 내 문제를 해결합니다.
Munawar

날짜 형식이 "12122019"인 경우 당신은 문제가 STIL
아타나시오 Kataras

6

ParseExact공식 문서를 확인하십시오.

정확한 표현을 알고 있다면 다음과 같이 할 수 있습니다.

  format = "ddd dd MMM yyyy h:mm tt zzz";
  try {
     result = DateTime.ParseExact(dateString, format, provider);
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
  }
  catch (FormatException) {
     Console.WriteLine("{0} is not in the correct format.", dateString);
  }

당신이 그것을 모른다면, 당신은 문화적 탐욕에 갇혀 있습니다

특정 문화권의 규칙을 사용하여 날짜 및 시간 문자열을 구문 분석하십시오. 구문 분석 (문자열, IFormatProvider) 과부하 (구문 분석 및 문화 규약 참조)


형식은 알려져 있지 않으며 사용자 기본 설정을 기반으로 할 수 있습니다.
Munawar

1
@Munawar 그 상황에서 2019 년 3 월 1 일과 2019 년 3 월 1 일을 어떻게 구분할 수 있습니까?
Blaise

@Athanasios, 응용 프로그램은 암호화 된 다른 지역 및 날짜에 사용됩니다. 왜냐하면 형식이 알려진 경우 ParseExact가 가장 적합하지만 사용자는 날짜 형식을 변경할 수 있으므로 특정 형식을 적용하는 것을 망칠 필요가 없습니다.
Munawar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.