Bagaimana membandingkan tanggal tertentu dengan hari ini

Saya ingin membandingkan tanggal tertentu dengan hari ini dan berikut kondisinya: Jika tanggal yang diberikan lebih besar dari atau sama dengan 6 bulan lebih awal dari hari ini, kembalikan benar jika tidak kembalikan salah

Kode:

string strDate = tbDate.Text; //2015-03-29
if (DateTime.Now.AddMonths(-6) == DateTime.Parse(strDate)) //if given date is equal to exactly 6 months past from today (change == to > if date has to be less 6 months)
{
    lblResult.Text = "true"; //this doesn't work with the entered date above.
}
else //otherwise give me the date which will be 6 months from a given date.
{
    DateTime dt2 = Convert.ToDateTime(strDate);
    lblResult.Text = "6 Months from given date is: " + dt2.AddMonths(6); //this works fine
}
  • Jika 6 bulan atau lebih dari 6 bulan itu yang saya inginkan untuk satu syarat
  • Kalau kurang dari 6 bulan syaratnya lain.

person Si8    schedule 29.09.2015    source sumber
comment
Seberapa tepatnya? Apakah waktu dihitung?   -  person Wai Ha Lee    schedule 29.09.2015
comment
jika waktu tidak masuk hitungan, ubahlah sekarang dengan Hari Ini   -  person CDrosos    schedule 29.09.2015
comment
@WaiHaLee Hanya beberapa bulan. Terima kasih.   -  person Si8    schedule 29.09.2015
comment
Bagaimana dengan 30 Februari?   -  person Alexei Levenkov    schedule 29.09.2015
comment
fungsi addmonths tidak akan dibuat pada 30 Januari hingga 30 Februari -› msdn.microsoft.com/en-us/library/ apa yang salah dengan kode Anda saat ini? ubah sekarang dengan hari ini dan dari tanggal saat ini strDate hanya pertahankan tanggal atau atur waktu menjadi 00:00:00 (seperti yang dilakukan .Today)   -  person CDrosos    schedule 29.09.2015
comment
@CDrosos tentu... tapi agak terlalu kabur: sebulan dari sekarang tidak masalah dalam teks lisan, tetapi bisa memiliki arti yang berbeda dalam kode - jika boleh mengubah hari kapan-kapan (31 Januari-›28 Februari) mengapa tidak? apakah boleh melakukan perubahan itu setiap saat (31 Maret -› 28 Apr)? (Pokoknya OP jelas hanya membutuhkan sebulan dan komentar saya tidak berguna).   -  person Alexei Levenkov    schedule 29.09.2015


Jawaban (2)


Masalah pertama Anda adalah Anda menggunakan DateTime.Now dan bukan DateTime.Today - jadi mengurangkan 6 bulan akan menghasilkan DateTime lagi dengan waktu tertentu, yang kecil kemungkinannya tepat tanggal/waktu Anda' sudah diurai. Untuk sisa postingan ini, saya berasumsi bahwa nilai yang Anda uraikan benar-benar sebuah tanggal, sehingga Anda mendapatkan DateTime dengan waktu tengah malam. (Tentu saja, menurut pandangan saya yang sangat bias, akan lebih baik menggunakan perpustakaan yang mendukung "tanggal" sebagai konsep kelas satu...)

Masalah berikutnya adalah Anda berasumsi bahwa mengurangkan 6 bulan dari hari ini dan membandingkannya dengan tanggal yang telah ditetapkan sama dengan menambahkan 6 bulan ke tanggal yang telah ditetapkan dan membandingkannya dengan hari ini. Operasi tersebut bukan operasi yang sama - aritmatika kalender tidak berfungsi seperti itu. Anda harus menentukan cara kerja yang Anda inginkan, dan konsisten. Misalnya:

DateTime start = DateTime.Parse(tbDate.Text);
DateTime end = start.AddMonths(6);
DateTime today = DateTime.Today;
if (end >= today)
{
    // Today is 6 months or more from the start date
}
else
{
    // ...
}

Atau sebagai alternatif - dan tidak dengan cara yang sama:

DateTime target = DateTime.Parse(tbDate.Text);
DateTime today = DateTime.Today;
DateTime sixMonthsAgo = today.AddMonths(-6);
if (sixMonthsAgo >= target)
{
    // Six months ago today was the target date or later
}
else
{
    // ...
}

Perhatikan bahwa Anda hanya boleh mengevaluasi DateTime.Today (atau DateTime.Now dll) sekali per rangkaian penghitungan - jika tidak, Anda dapat menemukan perubahannya di antara evaluasi.

person Jon Skeet    schedule 29.09.2015
comment
Maaf, ini syaratnya: Jika tanggal yang diberikan lebih besar atau sama dengan 6 bulan dari hari ini, kembalikan nilai true jika tidak, kembalikan salah. - person Si8; 29.09.2015
comment
@SiKni8: 6 bulan lebih lambat dari hari ini, atau 6 bulan lebih awal dari hari ini? Dan tahukah Anda bahwa itu berbeda dengan 6 bulan dari tanggal yang ditentukan, yaitu hari ini atau nanti? - person Jon Skeet; 29.09.2015
comment
6 bulan lebih awal dari hari ini. Maaf - person Si8; 29.09.2015
comment
@SiKni8: Benar, saya telah mengedit jawaban saya untuk menjelaskan hal ini, tetapi Anda benar-benar harus mengedit pertanyaan Anda agar lebih lebih jelas - dengan contoh. Harap diingat perbedaan antara hari ini - 6 bulan dan tanggal target + 6 bulan. - person Jon Skeet; 29.09.2015

Coba dengan ini

DateTime s = Convert.ToDateTime(tbDate.Text);
s = s.Date;

if (DateTime.Today.AddMonths(-6) == s) //if given date is equal to exactly 6 months past from today (change == to > if date has to be less 6 months)
{
lblResult.Text = "true"; //this doesn't work with the entered date above.
}

ganti == dengan >= atau ‹= sesuai kebutuhan Anda

person CDrosos    schedule 29.09.2015
comment
Apa gunanya s = s.Date + ts? s = s.Date akan memberikan hasil yang sama. - person juharr; 29.09.2015
comment
tidak, itu hanya mengambil tanggal dari s dan memberikan waktu 00:00:00 - person CDrosos; 29.09.2015
comment
ts adalah 0. Jadi menambahkannya tidak akan mengubah apa pun. - person juharr; 29.09.2015
comment
menurutku kamu benar, jadi kita hanya perlu mencatat tanggalnya - person CDrosos; 29.09.2015