C #에서 DateTime의 유효성을 검사하는 방법은 무엇입니까?


118

나는이 솔루션을 생각 해낸 유일한 사람이 아닌 것 같지만 더 나은 솔루션이 있다면 여기에 게시하십시오. 이 질문을 여기에 남겨두고 나와 다른 사람들이 나중에 검색 할 수 있도록하고 싶습니다.

텍스트 상자에 유효한 날짜가 입력되었는지 확인해야했는데 이것이 제가 생각 해낸 코드입니다. 포커스가 텍스트 상자를 벗어날 때 이것을 실행합니다.

try
{
    DateTime.Parse(startDateTextBox.Text);
}
catch
{
    startDateTextBox.Text = DateTime.Today.ToShortDateString();
}

1
<sarcasm> 답변으로 판단하면 TryParse를 사용해야한다고 생각합니다 </ sarcasm> 훌륭한 답변을 주셔서 감사합니다. TryParse에 대해 생각조차하지 못했습니다
Matt

2
누군가 오늘 질문하면 "조사가 충분하지 않다"는 이유로 부당하게 폐쇄 될 것이라는 Google의 쉬운 질문의 예입니다.
live-love

1
여기에 특별한 기능을 사용하지 않고이 작업을 수행 할 수있는 가장 쉬운 방법은 다음과 같습니다 < stackoverflow.com/questions/14917203/... >
Zameer


2
DateTimes로 작업하는 것은 항상 저음에서 고통입니다. 감사합니다
Gonzo345

답변:


269
DateTime.TryParse

이것은 더 빠르다고 믿으며 추악한 시도 / 잡기를 사용할 필요가 없음을 의미합니다. :)

예 :

DateTime temp;
if(DateTime.TryParse(startDateTextBox.Text, out temp))
{
  // Yay :)
}
else
{
  // Aww.. :(
}

2
내가 틀렸다면 정정하십시오.하지만 C #에서 (예를 들어 JavaScript와는 반대로) if / else 분기에 중괄호가 필요하지 않습니까? 오해하지 마세요, 저는 면밀히 조사하려는 것이 아닙니다. 환상적인 답변이며 도움이 되었기 때문에 +1하고 있습니다.하지만 이미 게시 된 답변을 볼 때 새로운 미래 사용자가 어떤지 알 수 없기 때문에 생각했습니다. 혼동 할 수 있습니다. 당신은 C #으로 중괄호에 문제가있는 경우 물론,이 질문은 ... 걱정거리가 될 것입니다
VoidKing

2
@VoidKing 중괄호에 대해서는 정확하지만 해당 블록에 문이 하나만있는 경우에는 사용할 필요가 없습니다. 이것은 다른 언어에도 적용되지만 이것이 새로운 코더에게 어떻게 오해를 일으킬 수 있는지 알 수 있습니다.
D.Galvez

2
@ D.Galvez 파티에 늦게와 주셔서 죄송 합니다만, 진술이 1 개 뿐인 경우에도 괄호를 포함하는 것이 가장 좋은 방법인가요? 이것은 개인적인 선호가 가장 중요한 상황 일 수 있으며,이 경우 가독성과 일관성을 위해 그것들을 포함 하는 것이 매우 좋습니다.
Nick

2
6 년 전에는 대괄호에 대한 그러한 논쟁이 일어날 것이라는 사실을 거의 알지 못했습니다.
qui apr.

다음으로 변수 초기화를 줄일 수 있습니다. if(DateTime.TryParse(startDateTextBox.Text, out var temp)):)
Alexandre Daubricourt

61

흐름 제어에 예외를 사용하지 마십시오. DateTime.TryParseDateTime.TryParseExact를 사용하십시오 . 개인적으로 특정 형식의 TryParseExact를 선호하지만 TryParse가 더 나은 경우가있을 수 있습니다. 원래 코드를 기반으로 한 사용 예 :

DateTime value;
if (!DateTime.TryParse(startDateTextBox.Text, out value))
{
    startDateTextox.Text = DateTime.Today.ToShortDateString();
}

이 접근 방식을 선호하는 이유 :

  • 보다 명확한 코드 (하고 싶은 작업이 표시됨)
  • 예외 포착 및 삼키는 것보다 더 나은 성능
  • 예를 들어 OutOfMemoryException, ThreadInterruptedException과 같이 예외를 부적절하게 포착하지 않습니다. (관련 예외를 포착하여이를 방지하기 위해 현재 코드를 수정할 수 있지만 TryParse를 사용하는 것이 여전히 좋습니다.)

24

다음은 문자열을 DateTime형식 으로 변환 할 수 있으면 true를 반환 하고 그렇지 않으면 false 를 반환하는 솔루션의 또 다른 변형입니다 .

public static bool IsDateTime(string txtDate)
{
    DateTime tempDate;
    return DateTime.TryParse(txtDate, out tempDate);
}

3
StackOverflow에 오신 것을 환영합니다! 특히 3 년이 넘고 성공적으로 답변 된 질문에 답변 할 때 이미 제공된 답변을 확인하십시오. 귀하의 답변은 이미 이전 응답자들이 다루었습니다.
Bob Kaufman



3

사용시 문제 DateTime.TryParse는 구분 기호없이 입력 된 날짜의 매우 일반적인 데이터 입력 사용 사례를 지원하지 않는다는 것입니다 (예 : 011508.

이를 지원하는 방법의 예는 다음과 같습니다. (이것은 내가 구축중인 프레임 워크에서 가져온 것이므로 서명이 약간 이상하지만 핵심 로직을 사용할 수 있어야합니다.)

    private static readonly Regex ShortDate = new Regex(@"^\d{6}$");
    private static readonly Regex LongDate = new Regex(@"^\d{8}$");

    public object Parse(object value, out string message)
    {
        msg = null;
        string s = value.ToString().Trim();
        if (s.Trim() == "")
        {
            return null;
        }
        else
        {
            if (ShortDate.Match(s).Success)
            {
                s = s.Substring(0, 2) + "/" + s.Substring(2, 2) + "/" + s.Substring(4, 2);
            }
            if (LongDate.Match(s).Success)
            {
                s = s.Substring(0, 2) + "/" + s.Substring(2, 2) + "/" + s.Substring(4, 4);
            }
            DateTime d = DateTime.MinValue;
            if (DateTime.TryParse(s, out d))
            {
                return d;
            }
            else
            {
                message = String.Format("\"{0}\" is not a valid date.", s);
                return null;
            }
        }

    }

마스크 된 텍스트 상자를 사용하고 있기 때문에 내 경우 구분 기호에 대해 걱정하지 않지만이 앱에서 발생할 수있는 다른 상황에서 어떻게 편리 할 지 알 수 있습니다.
Matt

구분 기호없이 DateTime 문자열을 사용하는 이유는 무엇입니까?
Sergei Kovalenko

1
    protected bool ValidateBirthday(String date)
    {
        DateTime Temp;

        if (DateTime.TryParse(date, out Temp) == true &&
      Temp.Hour == 0 &&
      Temp.Minute == 0 &&
      Temp.Second == 0 &&
      Temp.Millisecond == 0 &&
      Temp > DateTime.MinValue)
            return true;
        else
            return false;
    }

// 입력 문자열이 짧은 날짜 형식이라고 가정합니다.
예를 들어 "2013/7/5"는 true를 반환하거나
"2013/2/31"은 false를 반환합니다.
http://forums.asp.net/t/1250332.aspx/1
// bool booleanValue = ValidateBirthday ( "12:55"); 거짓을 반환


1
private void btnEnter_Click(object sender, EventArgs e)
{
    maskedTextBox1.Mask = "00/00/0000";
    maskedTextBox1.ValidatingType = typeof(System.DateTime);
    //if (!IsValidDOB(maskedTextBox1.Text)) 
    if (!ValidateBirthday(maskedTextBox1.Text))
        MessageBox.Show(" Not Valid");
    else
        MessageBox.Show("Valid");
}
// check date format dd/mm/yyyy. but not if year < 1 or > 2013.
public static bool IsValidDOB(string dob)
{ 
    DateTime temp;
    if (DateTime.TryParse(dob, out temp))
        return (true);
    else 
        return (false);
}
// checks date format dd/mm/yyyy and year > 1900!.
protected bool ValidateBirthday(String date)
{
    DateTime Temp;
    if (DateTime.TryParse(date, out Temp) == true &&
        Temp.Year > 1900 &&
       // Temp.Hour == 0 && Temp.Minute == 0 &&
        //Temp.Second == 0 && Temp.Millisecond == 0 &&
        Temp > DateTime.MinValue)
        return (true);
    else
        return (false);
}

1

모든 답변은 상당히 훌륭하지만 단일 기능을 사용하려는 경우 작동 할 수 있습니다.

private bool validateTime(string dateInString)
{
    DateTime temp;
    if (DateTime.TryParse(dateInString, out temp))
    {
       return true;
    }
    return false;
}

1
"if"블록 대신 DateTime.TryParse ()의 결과를 반환하는 것은 어떻습니까? 또한 IDE는 결코 사용되지 않은 temp에 대해 불평 할 것입니다. 이것은 함수 호출 내부에서 "out DateTime temp"로 직접 선언 할 수 있습니다.
Sergei Kovalenko

0

DateTime특정 형식에 대한 형식을 정의 할 수도 있습니다.CultureInfo

public static bool IsDateTime(string tempDate)
{
    DateTime fromDateValue;
    var formats = new[] { "MM/dd/yyyy", "dd/MM/yyyy h:mm:ss", "MM/dd/yyyy hh:mm tt", "yyyy'-'MM'-'dd'T'HH':'mm':'ss" };
    return DateTime.TryParseExact(tempDate, formats, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out fromDateValue);
}

-1
protected static bool CheckDate(DateTime date)
{
    if(new DateTime() == date)      
        return false;       
    else        
        return true;        
} 

2
이 코드가 문제를 해결할 수 있지만 문제를 해결하는 방법과 이유에 대한 설명포함 하여 게시물의 품질을 향상시키는 데 실제로 도움이되며 아마도 더 많은 찬성 투표를 받게됩니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Brian

질문은 값을 string포함하거나 포함하지 않을 수 있는 유효성을 검사하는 방법을 묻는 것 DateTIme입니다. 주어진 항목 DateTime에 기본값 (에 해당 0001-01-01T00:00:00.0000000) 이 있는지 확인하고 있습니다 . 이것은 질문에 어떻게 대답합니까?
dbc

-3
DateTime temp;
try
{
    temp = Convert.ToDateTime(grd.Rows[e.RowIndex].Cells["dateg"].Value);
    grd.Rows[e.RowIndex].Cells["dateg"].Value = temp.ToString("yyyy/MM/dd");
}
catch 
{   
    MessageBox.Show("Sorry The date not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop,MessageBoxDefaultButton.Button1,MessageBoxOptions .RightAlign);
    grd.Rows[e.RowIndex].Cells["dateg"].Value = null;
}

1
U try catch하여 유효한지 확인해야합니다. 그래서 U는 try catch를 사용하여 모든 유형의 변수를 확인하고 유효한 전역 함수를 만들고 프로젝트에서 모두 제어 할 수 있습니다. ..... 라프의 khalifah 안부
라프 Khalifah

-3
DateTime temp;
try
{
    temp = Convert.ToDateTime(date);
    date = temp.ToString("yyyy/MM/dd");
}
catch 
{
    MessageBox.Show("Sorry The date not valid", "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop,MessageBoxDefaultButton.Button1,MessageBoxOptions .RightAlign);
    date = null;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.