문자열이 유효한 DateTime "형식 dd / MM / yyyy"로 인식되지 않았습니다.


172

문자열 형식의 값을 format을 사용하여 날짜 유형으로 변환하려고합니다 dd/MM/yyyy.

this.Text="22/11/2009";

DateTime date = DateTime.Parse(this.Text);

무엇이 문제입니까? 요청하는 두 번째 재정의가 있습니다 IFormatProvider. 이게 뭐야? 나는이 통과해야합니까? 그렇다면이 경우에 어떻게 사용합니까?

편집하다

의 차이점은 무엇입니까 Parse와는 ParseExact?

편집 2

Slaks와 Sam의 대답은 모두 나를 위해 일하고 있습니다. 현재 사용자가 입력을하고 있지만 이것은 maskTextbox를 사용하여 유효하다는 것을 보증합니다.

유형 안전, 성능 또는 기분이 좋은 것과 같은 모든 측면을 고려하면 어떤 대답이 더 낫습니까?


7
@ 편집 : 그게 바로 문서입니다. msdn.microsoft.com/ko-kr/library/w2sa9yss.aspx
SLaks

2
ParseExact는 날짜 문자열의 정확한 형식을 알고있을 때, ParseExact는 좀 더 역동적 인 것을 처리 할 수있는 것을 원할 때 사용합니다.
gingerbreadboy

답변:


255

사용하십시오 DateTime.ParseExact.

this.Text="22/11/2009";

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);

8
여기서 null을 전달해야하는 이유는 무엇입니까?
Shantanu Gupta

3
입력은 "22/11/2009 12:00:00 AM"또는 "22/11/2009"일 수 있습니다. 또한 개발 기계의 문화는 생산의 문화와 다를 수 있습니다. 위의 코드가 완벽하게 작동합니까?
Rahatur

8
@Rahat, 형식이 일치하지 않으면 정확한 구문 분석이 작동하지 않습니다. 위의 형식 패턴은 dd/MM/yyyy시간이 포함 된 텍스트 문자열이므로 올바르게 구문 분석되지 않습니다. 시간을 없애거나 형식 패턴에 포함시켜야합니다. 오버로드가 ParseExact있어 형식 패턴 배열을 허용하고 텍스트가 일치하면 텍스트를 구문 분석합니다.
사무엘 네프

7
@SamuelNeff CultureInfo.InvariantCulture어쨌든 형식을 정의하는 경우 현재 형식 대신 사용하지 않는 이유는 무엇 입니까?
Alvin Wong

3
@Toolkit 그 이유는 형식 문자열의 슬래시가 리터럴 슬래시가 아니기 때문입니다. 현재 문화권에서 날짜 구분자 문자열로 대체됩니다. 따라서 그것은 위에 쓰여진 방식으로 문화에 달려 있습니다. Samuel Neff, 시도해보십시오 Thread.CurrentThread.CurrentCulture = new CultureInfo("da-DK");. 솔루션이 깨질 것입니다. 이 문제를 해결하려면 "dd'/'MM'/'yyyy"(작은 따옴표로 슬래시 보호) 또는 @"dd\/MM\/yyyy"(백 슬래시로 슬래시를 "이스케이프 처리")를 사용하십시오.
Jeppe Stig Nielsen

44

전화해야합니다 ParseExact 한 형식과 정확히 일치하는 날짜를 구문 분석하는 .

예를 들면 다음과 같습니다.

DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", CultureInfo.InvariantCulture);

IFormatProvider매개 변수는 날짜를 구문 분석하는 데 사용할 문화권을 지정합니다.
문자열이 사용자로부터 온 경우가 아니면를 전달해야합니다 CultureInfo.InvariantCulture.
문자열이 사용자로부터 온 경우 사용자 CultureInfo.CurrentCulture가 제어판의 국가 별 옵션에서 지정한 설정을 사용하여 전달해야합니다 .


2
@ Slaks : CultureInfo.InvariantCulture는 코드에서 사용할 수 없습니다. 일부 네임 스페이스를 사용해야합니까
Shantanu Gupta

3
using System.Globalization;
SLaks

2
오류를 마우스 오른쪽 버튼으로 클릭하고 해결을 클릭하면 누락 된 네임 스페이스에 배치됩니다.
Inkey

오류를 두 번 클릭하고 사용할 수있는 관련 네임 스페이스를 보여주는 화살표가 아래로 표시됩니다.
Usman Younas

예를 들어 문자열 형식이 "MM / dd / yyyy HH : mm : ss"(주 -2 공백) 인 경우 공백도 포함됩니다. ParseExact의 형식에는 공백도 포함해야합니다.
Chris Halcrow

20

문화권마다 날짜 형식이 다르기 때문에 DateTime의 문자열 표현을 구문 분석하는 것은 까다로운 작업입니다. .Net은 이러한 날짜 형식을 알고 있으며 System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat전화를 걸면 현재 문화권에서 날짜 형식을 가져옵니다 DateTime.Parse(this.Text).

예를 들어 문자열 "22/11/2009"는 미국 (en-US) 의 ShortDatePattern 과 일치하지 않지만 프랑스 (fr-FR)와 일치합니다.

이제 DateTime.ParseExact예상 한 정확한 형식 문자열을 호출 하여 전달하거나 적절한 문화권을 전달 DateTime.Parse하여 날짜를 구문 분석 할 수 있습니다.

예를 들어 날짜를 올바르게 구문 분석합니다.

DateTime.Parse( "22/11/2009", CultureInfo.CreateSpecificCulture("fr-FR") );

물론, 무작위로 프랑스를 선택하는 것이 아니라 자신의 필요에 맞는 것을 선택해야합니다.

당신이 알아 내야 할 것은 무엇 System.Threading.Thread.CurrentThread.CurrentCulture으로 설정되어 있으며, 그것이 예상되는 것과 다른지 여부입니다.


귀하의 솔루션이 나를 위해 작동하지 않습니다 "문자열이 유효한 DateTime으로 인식되지 않았습니다"와 같은 오류가 발생합니다. 그리고 다음 입력 날짜 : "13/06/17"을 솔루션에 전달하지만 오류가 발생합니다 .Plz 도와주세요.
Ghanshyam Lakhani

16

위의 솔루션이 효과적이지만 다음을 사용하여 webconfig 파일을 수정할 수도 있습니다.

<configuration>
   <system.web>
     <globalization culture="en-GB"/>
   </system.web>
</configuration>

참고 : 생산 기계와 로컬 기계에서 다른 날짜 시간 형식


1
필립스 님, 하루를 저축하셨습니다. 가능한 모든 것을 시도했습니다. 그리고이 작은 변화는 효과가 있습니다. 감사.
RNH

1
아미, 당신은 진정으로 하나님의 아들입니다.
분노의 곰


4

많은 시간을 보낸 후 문제를 해결했습니다.

 string strDate = PreocessDate(data);
 string[] dateString = strDate.Split('/');
 DateTime enter_date = Convert.ToDateTime(dateString[1]+"/"+dateString[0]+"/"+dateString[2]);

3

문자열을 datetime으로 변환하려면 이것을 사용하십시오.

Datetime DT = DateTime.ParseExact(STRDATE,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat)

3

이 참조를 기반으로 다음 접근 방식이 저에게 효과적이었습니다.

// e.g. format = "dd/MM/yyyy", dateString = "10/07/2017" 
var formatInfo = new DateTimeFormatInfo()
{
     ShortDatePattern = format
};
date = Convert.ToDateTime(dateString, formatInfo);

2
private DateTime ConvertToDateTime(string strDateTime)
{
DateTime dtFinaldate; string sDateTime;
try { dtFinaldate = Convert.ToDateTime(strDateTime); }
catch (Exception e)
{
string[] sDate = strDateTime.Split('/');
sDateTime = sDate[1] + '/' + sDate[0] + '/' + sDate[2];
dtFinaldate = Convert.ToDateTime(sDateTime);
}
return dtFinaldate;
}

1

위의 누군가가 문자열 매개 변수로 보낼 수 있지만 예를 들어 '20130121'과 같은 형식이어야하며 컨트롤에서 직접 가져 와서 해당 형식으로 변환 할 수 있습니다. 예를 들어 다음과 같은 텍스트 상자에서 얻을 수 있습니다.

date = datetextbox.text; // date is going to be something like: "2013-01-21 12:00:00am"

그것을 '20130121'로 변환하려면 다음을 사용하십시오.

date = date.Substring(6, 4) + date.Substring(3, 2) + date.Substring(0, 2);

SQL이이를 변환하여 데이터베이스에 넣을 수 있도록합니다.


0

당신은 또한 사용할 수 있습니다

this.Text = "22112009";
DateTime newDateTime = new DateTime(Convert.ToInt32(this.Text.Substring(4, 4)), // Year
                                    Convert.ToInt32(this.Text.Substring(2,2)), // Month
                                    Convert.ToInt32(this.Text.Substring(0,2)));// Day

0

코드 아래에서 나를 위해 일했습니다.

DateTime date = DateTime.Parse(this.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

네임 스페이스

using System.Globalization;

-6

수동 변경 :

string s = date.Substring(3, 2) +"/" + date.Substring(0, 2) + "/" + date.Substring(6, 4);

2015 년 11 월 22 일부터 2015 년 11 월 22 일에 변환됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.