Bagaimana cara memvalidasi DateTime di C #?

118

Saya ragu saya satu-satunya yang menemukan solusi ini, tetapi jika Anda memiliki solusi yang lebih baik, silakan posting di sini. Saya hanya ingin meninggalkan pertanyaan ini di sini sehingga saya dan orang lain dapat mencarinya nanti.

Saya perlu mengetahui apakah tanggal yang valid telah dimasukkan ke dalam kotak teks dan ini adalah kode yang saya buat. Saya mengaktifkan ini saat fokus meninggalkan kotak teks.

try
{
    DateTime.Parse(startDateTextBox.Text);
}
catch
{
    startDateTextBox.Text = DateTime.Today.ToShortDateString();
}
Matt
sumber
1
<sarcasm> menilai dari jawabannya, saya pikir saya harus menggunakan TryParse </sarcasm> Terima kasih atas jawaban yang bagus guys. Saya bahkan tidak memikirkan TryParse
Matt
2
Contoh pertanyaan mudah untuk Google yang jika seseorang bertanya hari ini akan ditutup secara tidak adil karena "tidak cukup penelitian".
cinta hidup
1
berikut adalah cara mudah untuk melakukan ini tanpa menggunakan fungsi khusus: < stackoverflow.com/questions/14917203/… >
Zameer
2
Bekerja dengan DateTimes selalu merepotkan. Terima kasih
Gonzo345

Jawaban:

269
DateTime.TryParse

Ini saya percaya lebih cepat dan itu berarti Anda tidak perlu menggunakan try / catches yang jelek :)

misalnya

DateTime temp;
if(DateTime.TryParse(startDateTextBox.Text, out temp))
{
  // Yay :)
}
else
{
  // Aww.. :(
}
qui
sumber
2
Koreksi saya jika saya salah, tetapi di C # (sebagai lawan, katakanlah, JavaScript) bukankah cabang if / else memerlukan kurung kurawal? Jangan salah paham, saya tidak mencoba memeriksa dengan cermat, ini jawaban yang fantastis dan saya memberi +1 karena membantu saya, tetapi hanya berpikir karena Anda tidak pernah tahu bagaimana pengguna baru di masa mendatang saat melihat jawaban yang sudah diposting, ini bisa membingungkan mereka. Tentu saja, jika Anda mengalami masalah dengan kurung kurawal di C #, pertanyaan ini akan menjadi kekhawatiran Anda yang paling kecil ...
VoidKing
2
@VoidKing Anda benar tentang kurung kurawal tetapi jika Anda hanya memiliki 1 pernyataan di blok itu, Anda tidak harus menggunakannya. Ini berlaku di beberapa bahasa lain juga, tetapi saya dapat melihat bagaimana ini dapat menyesatkan untuk pembuat kode yang lebih baru.
D. Galvez
2
@ D.Galvez Maaf terlambat datang ke pesta, tetapi apakah praktik terbaik untuk menyertakan tanda kurung meskipun hanya ada 1 pernyataan? Ini mungkin hanya situasi di mana preferensi pribadi adalah yang paling penting - dan dalam hal ini saya merasa memasukkannya cukup bagus hanya untuk keterbacaan dan konsistensi.
Nick
2
Sedikit yang saya tahu 6 tahun yang lalu bahwa perdebatan tentang tanda kurung akan terjadi.
qui
Dimungkinkan untuk mempersingkat inisialisasi variabel dengan if(DateTime.TryParse(startDateTextBox.Text, out var temp)):)
Alexandre Daubricourt
61

Jangan gunakan pengecualian untuk kontrol aliran. Gunakan DateTime.TryParse dan DateTime.TryParseExact . Secara pribadi saya lebih suka TryParseExact dengan format tertentu, tapi saya rasa ada kalanya TryParse lebih baik. Contoh penggunaan berdasarkan kode asli Anda:

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

Alasan memilih pendekatan ini:

  • Kode yang lebih jelas (dikatakan apa yang ingin dilakukannya)
  • Performa yang lebih baik daripada menangkap dan menelan pengecualian
  • Ini tidak menangkap pengecualian dengan tidak tepat - misalnya OutOfMemoryException, ThreadInterruptedException. (Kode Anda saat ini dapat diperbaiki untuk menghindari hal ini dengan hanya menangkap pengecualian yang relevan, tetapi menggunakan TryParse akan tetap lebih baik.)
Jon Skeet
sumber
24

Berikut variasi lain dari solusi yang mengembalikan nilai true jika string dapat diubah menjadi DateTimetipe, dan false sebaliknya.

public static bool IsDateTime(string txtDate)
{
    DateTime tempDate;
    return DateTime.TryParse(txtDate, out tempDate);
}
Brendan Conrad
sumber
3
Selamat datang di StackOverflow! Silahkan lihat jawaban yang sudah diberikan, terutama saat menjawab pertanyaan yang sudah berumur lebih dari tiga tahun dan sudah berhasil dijawab. Jawaban Anda telah dicakup oleh responden sebelumnya.
Bob Kaufman
3

Masalah dengan penggunaan DateTime.TryParseadalah bahwa itu tidak mendukung kasus penggunaan entri data yang sangat umum dari tanggal yang dimasukkan tanpa pemisah, misalnya 011508.

Berikut adalah contoh bagaimana mendukungnya. (Ini dari kerangka kerja yang saya bangun, jadi tanda tangannya agak aneh, tetapi logika intinya harus dapat digunakan):

    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;
            }
        }

    }
Robert Rossney
sumber
Saya tidak khawatir tentang pemisah dalam kasus saya karena saya menggunakan Kotak Teks Bertopeng, tetapi saya dapat melihat bagaimana itu akan berguna dalam situasi lain yang mungkin saya temui dengan aplikasi ini.
Matt
Apa alasan menggunakan string DateTime tanpa pemisah?
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;
    }

// misalkan string input adalah format tanggal pendek.
misalnya "2013/7/5" mengembalikan nilai benar atau
"2013/2/31" mengembalikan salah.
http://forums.asp.net/t/1250332.aspx/1
// bool booleanValue = ValidateBirthday ("12:55"); mengembalikan salah

Chung_TheWebDeveloper
sumber
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);
}
Julius
sumber
1

Semua Jawabannya Cukup bagus tetapi jika Anda ingin menggunakan satu fungsi, ini mungkin berhasil.

private bool validateTime(string dateInString)
{
    DateTime temp;
    if (DateTime.TryParse(dateInString, out temp))
    {
       return true;
    }
    return false;
}
Sayed Muhammad Idrees
sumber
1
Bagaimana jika mengembalikan hasil DateTime.TryParse () dan bukan blok "if"? Selain itu, IDE Anda akan mengeluh pada temp yang tidak pernah digunakan, yang dapat Anda deklarasikan di dalam pemanggilan fungsi secara langsung sebagai "out DateTime temp".
Sergei Kovalenko
0

Anda juga dapat menentukan DateTimeformat tertentuCultureInfo

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);
}
Yanga
sumber
-1
protected static bool CheckDate(DateTime date)
{
    if(new DateTime() == date)      
        return false;       
    else        
        return true;        
} 
Hasan_H
sumber
2
Meskipun kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan tentang bagaimana dan mengapa ini menyelesaikan masalah akan sangat membantu meningkatkan kualitas posting Anda, dan mungkin menghasilkan lebih banyak suara. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang. Harap edit jawaban Anda untuk menambahkan penjelasan dan memberikan indikasi batasan dan asumsi apa yang berlaku.
Brian
Pertanyaannya adalah menanyakan bagaimana memvalidasi stringyang mungkin atau mungkin tidak mengandung DateTImenilai. Anda memeriksa untuk melihat apakah suatu yang diberikan DateTimememiliki nilai default (sesuai dengan 0001-01-01T00:00:00.0000000). Bagaimana ini menjawab pertanyaan?
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;
}
Ashraf Khalifah
sumber
1
Anda harus memeriksa valid dengan mencoba menangkap. Jadi Anda dapat menggunakan try catch untuk memeriksa semua jenis variabel dan membuat Fungsi Global yang valid dan mengontrol semua dalam proyek Anda. salam ..... Ashraf khalifah
Ashraf 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;
}
Ashraf Khalifah
sumber