ฉันกำลังพยายามหาสาเหตุว่าบัญชีจะหมดอายุในเวลาไม่ถึง 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)
{
// ...
}