ฉันกำลังพยายามหาสาเหตุว่าบัญชีจะหมดอายุในเวลาไม่ถึง 30 วัน ฉันใช้ DateTime Compare อย่างถูกต้องหรือไม่?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
ฉันกำลังพยายามหาสาเหตุว่าบัญชีจะหมดอายุในเวลาไม่ถึง 30 วัน ฉันใช้ DateTime Compare อย่างถูกต้องหรือไม่?
if (DateTime.Compare(expiryDate, now) < 30)
{
matchFound = true;
}
คำตอบ:
ฉันใช้ DateTime Compare อย่างถูกต้องหรือไม่?
ไม่ได้Compareนำเสนอข้อมูลเกี่ยวกับตำแหน่งสัมพัทธ์ของวันที่สองวัน: น้อยกว่าเท่ากันหรือมากกว่า สิ่งที่คุณต้องการมีดังนี้:
if ((expiryDate - DateTime.Now).TotalDays < 30)
matchFound = true;
นี่ลบสองDateTimeวินาที ผลลัพธ์คือTimeSpanวัตถุที่มีTotalDaysคุณสมบัติ
นอกจากนี้เงื่อนไขสามารถเขียนโดยตรงเป็น:
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
ไม่ifจำเป็น
TotalDaysแทนวัน
Daysเป็นส่วนประกอบที่ใหญ่ที่สุดของTimeSpan. คนที่อ่านสิ่งนี้สามารถคาดเดาได้ว่าSecondsอสังหาริมทรัพย์นั้นทำงานในลักษณะเดียวกัน
Daysตัวมันเองก็อาจผิดได้เช่นกัน DaysและTotalDaysเหมือนกันที่นี่เพียงเพราะเงื่อนไขเป็น< 30แต่จะมีความแตกต่างที่ชัดเจนหากเป็น<= 30เช่นนั้นเพราะTotalDaysอาจส่งคืนบางอย่างเช่น30.421ในขณะที่Daysยังคงกลับ30มา
ควรจะเป็น
matchFound = (expiryDate - DateTime.Now).TotalDays < 30;
สังเกตจำนวนวันทั้งหมดมิฉะนั้นคุณจะมีพฤติกรรมที่ผิดปกติ
TotalDaysเป็นฟิลด์ที่ถูกต้องตามแนวคิดที่จะใช้ ในทางปฏิบัติพวกเขาให้ผลลัพธ์เดียวกัน แต่เพียงเพราะDaysเป็นองค์ประกอบที่ใหญ่ที่สุดมีองค์ประกอบTimeSpanเดือนหรือปีและนี่จะเป็นเรื่องที่แตกต่างกัน เพียงแค่ลองด้วยHours, SecondsหรือMillisecondsเพื่อดูว่าพวกเขาทำงาน
ฉันจะทำแบบนี้แทน:
TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30)
matchFound = true;
เปรียบเทียบเฉพาะการตอบสนองด้วยจำนวนเต็มที่ระบุสภาพอากาศครั้งแรกก่อนหน้าเดียวกันหรือใหม่กว่า
ลองใช้วิธีนี้แทน
if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) {
matchFound = true;
}
เปรียบเทียบผลตอบแทน 1, 0, -1 สำหรับมากกว่าเท่ากับน้อยกว่าตามลำดับ
คุณต้องการ:
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0)
{
bool matchFound = true;
}
สิ่งนี้จะให้ผลลัพธ์ที่ถูกต้อง:
if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
matchFound = true;
การเปรียบเทียบเป็นสิ่งที่ไม่จำเป็นDays / TotalDaysไม่จำเป็น
สิ่งที่คุณต้องการคือ
if (expireDate < DateTime.Now) {
// has expired
} else {
// not expired
}
โปรดทราบว่าวิธีนี้จะได้ผลหากคุณตัดสินใจใช้นาทีหรือเดือนหรือปีเป็นเกณฑ์การหมดอายุของคุณ
สมมติว่าคุณต้องการมอบหมายfalse(ถ้ามี) ให้matchtimeวิธีที่ง่ายกว่าในการเขียนคือ ..
matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);
ไม่ฟังก์ชันเปรียบเทียบจะส่งคืน 1, 0 หรือ -1 0 เมื่อทั้งสองค่าเท่ากัน -1 และ 1 หมายถึงน้อยกว่าและมากกว่าฉันเชื่อในลำดับนั้น แต่ฉันมักจะผสมกัน
ไม่คุณใช้ไม่ถูกต้อง
ดูรายละเอียดได้ที่นี่
DateTime t1 = new DateTime(100);
DateTime t2 = new DateTime(20);
if (DateTime.Compare(t1, t2) > 0) Console.WriteLine("t1 > t2");
if (DateTime.Compare(t1, t2) == 0) Console.WriteLine("t1 == t2");
if (DateTime.Compare(t1, t2) < 0) Console.WriteLine("t1 < t2");
สิ่งที่คุณต้องการทำคือลบ DateTimes สองรายการ (expiryDate และ DateTime.Now) สิ่งนี้จะส่งคืนวัตถุประเภท TimeSpan TimeSpan มีคุณสมบัติเป็น "วัน" เปรียบเทียบตัวเลขนั้นกับ 30 สำหรับคำตอบของคุณ
ไม่ถูกต้องลองทำดังนี้:
DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
matchFound = true;
}
จริงๆแล้วคำตอบเหล่านี้ไม่ได้ผลสำหรับฉัน ฉันแก้ไขได้โดยทำดังนี้:
if ((expireDate.Date - DateTime.Now).Days > -30)
{
matchFound = true;
}
เมื่อฉันพยายามทำสิ่งนี้:
matchFound = (expiryDate - DateTime.Now).Days < 30;
วันนี้ 2011-11-14 และวันหมดอายุของฉันคือ 2011-10-17 ฉันได้รับ matchFound นั้น = -28 แทนที่จะเป็น 28 ฉันจึงกลับรายการเช็คล่าสุด
// this isn't set up for good processing.
//I don't know what data set has the expiration
//dates of your accounts. I assume a list.
// matchfound is a single variablethat returns true if any 1 record is expired.
bool matchFound = false;
DateTime dateOfExpiration = DateTime.Today.AddDays(-30);
List<DateTime> accountExpireDates = new List<DateTime>();
foreach (DateTime date in accountExpireDates)
{
if (DateTime.Compare(dateOfExpiration, date) != -1)
{
matchFound = true;
}
}
คุณสามารถลองทำสิ่งนี้:
var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{
// ...
}