DateTime เปรียบเทียบวิธีตรวจสอบว่าวันที่มีอายุน้อยกว่า 30 วันหรือไม่?


86

ฉันกำลังพยายามหาสาเหตุว่าบัญชีจะหมดอายุในเวลาไม่ถึง 30 วัน ฉันใช้ DateTime Compare อย่างถูกต้องหรือไม่?

if (DateTime.Compare(expiryDate, now) < 30)

{
     matchFound = true;
}

คำตอบ:


234

ฉันใช้ DateTime Compare อย่างถูกต้องหรือไม่?

ไม่ได้Compareนำเสนอข้อมูลเกี่ยวกับตำแหน่งสัมพัทธ์ของวันที่สองวัน: น้อยกว่าเท่ากันหรือมากกว่า สิ่งที่คุณต้องการมีดังนี้:

if ((expiryDate - DateTime.Now).TotalDays < 30)
    matchFound = true;

นี่ลบสองDateTimeวินาที ผลลัพธ์คือTimeSpanวัตถุที่มีTotalDaysคุณสมบัติ

นอกจากนี้เงื่อนไขสามารถเขียนโดยตรงเป็น:

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

ไม่ifจำเป็น


2
ควรได้รับอนุญาตให้คุณ 2+;) หนึ่งสำหรับคำตอบและอีกหนึ่งสำหรับวิธีสั้น ๆ ในการแสดง
CheGueVerra

4
เอ่อ…ฉันเพิ่งตอบคำถามให้ยาวขึ้นดังนั้นอย่าลังเลที่จะลบหนึ่งการโหวตในจินตนาการ ;-)
Konrad Rudolph

1
กรุณาใช้TotalDaysแทนวัน
João Portela

2
มีความแม่นยำในเชิงแนวคิดมากขึ้น ไม่สร้างความแตกต่างเนื่องจากDaysเป็นส่วนประกอบที่ใหญ่ที่สุดของTimeSpan. คนที่อ่านสิ่งนี้สามารถคาดเดาได้ว่าSecondsอสังหาริมทรัพย์นั้นทำงานในลักษณะเดียวกัน
João Portela

2
การเพิ่มประเด็นที่João Portela สร้างขึ้นแม้แต่Daysตัวมันเองก็อาจผิดได้เช่นกัน DaysและTotalDaysเหมือนกันที่นี่เพียงเพราะเงื่อนไขเป็น< 30แต่จะมีความแตกต่างที่ชัดเจนหากเป็น<= 30เช่นนั้นเพราะTotalDaysอาจส่งคืนบางอย่างเช่น30.421ในขณะที่Daysยังคงกลับ30มา
Racil Hilan

15

ควรจะเป็น

matchFound = (expiryDate - DateTime.Now).TotalDays < 30;

สังเกตจำนวนวันทั้งหมดมิฉะนั้นคุณจะมีพฤติกรรมที่ผิดปกติ


คำตอบนี้ใช้เวลามากกว่าหนึ่งปีหลังจากการแก้ไขครั้งสุดท้ายเพื่อตอบรับคำตอบ!
Mitch Wheat

@ มิทช์ - นี่คือคำตอบที่ถูกต้องสังเกตว่าเขาใช้ TotalDays มากกว่า Days
Marcelo Mason

คำตอบที่ยอมรับนั้นถูกต้อง TotalDays ส่งคืนส่วนที่เป็นเศษส่วนเช่นกันซึ่งซ้ำซ้อนเมื่อเปรียบเทียบกับจำนวนเต็ม
Mitch Wheat

1
@MitchWheat TotalDaysเป็นฟิลด์ที่ถูกต้องตามแนวคิดที่จะใช้ ในทางปฏิบัติพวกเขาให้ผลลัพธ์เดียวกัน แต่เพียงเพราะDaysเป็นองค์ประกอบที่ใหญ่ที่สุดมีองค์ประกอบTimeSpanเดือนหรือปีและนี่จะเป็นเรื่องที่แตกต่างกัน เพียงแค่ลองด้วยHours, SecondsหรือMillisecondsเพื่อดูว่าพวกเขาทำงาน
João Portela

7

ฉันจะทำแบบนี้แทน:

TimeSpan diff = expiryDate - DateTime.Today;
if (diff.Days > 30) 
   matchFound = true;

เปรียบเทียบเฉพาะการตอบสนองด้วยจำนวนเต็มที่ระบุสภาพอากาศครั้งแรกก่อนหน้าเดียวกันหรือใหม่กว่า


6

ลองใช้วิธีนี้แทน

if ( (expiryDate - DateTime.Now ).TotalDays < 30 ) { 
  matchFound = true;
}

1
อืมคุณต้องสลับลำดับวันที่หรือใช้ค่าสัมบูรณ์เว้นแต่จะผ่านวันหมดอายุไปแล้ว
Konrad Rudolph

3

เปรียบเทียบผลตอบแทน 1, 0, -1 สำหรับมากกว่าเท่ากับน้อยกว่าตามลำดับ

คุณต้องการ:

    if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(30)) <= 0) 
    { 
        bool matchFound = true;
    }

1

สิ่งนี้จะให้ผลลัพธ์ที่ถูกต้อง:

if ((expiryDate.Date - DateTime.Now.Date).Days < 30)
    matchFound = true;

จริงๆแล้วสิ่งที่เกิดขึ้น hr คือเช่นexpryDteคือ 28/4/2011 ถ้าคุณทำพิธี (expiryDate-DateTime.now) ก็จะใช้เวลาเช่นกัน (28/4/2554 12:00:00 AM - 26/4/2011 11 : 47: 00 น.) และโค้ดด้านบนจะมีค่าเป็น 28/4/2011 12:00:00 AM -26/4/2011 12:00:00 AM ซึ่งไม่ถูกต้อง
Jayant

1

การเปรียบเทียบเป็นสิ่งที่ไม่จำเป็นDays / TotalDaysไม่จำเป็น

สิ่งที่คุณต้องการคือ

if (expireDate < DateTime.Now) {
    // has expired
} else {
    // not expired
}

โปรดทราบว่าวิธีนี้จะได้ผลหากคุณตัดสินใจใช้นาทีหรือเดือนหรือปีเป็นเกณฑ์การหมดอายุของคุณ


1
ไม่ใช่คำตอบที่ดีเพราะตอนนี้คุณคิดเป็นชั่วโมงนาทีและวินาที DateTime. วันนี้จะถูกต้องมากขึ้นสำหรับสถานการณ์ OPs
JL.

1

สมมติว่าคุณต้องการมอบหมายfalse(ถ้ามี) ให้matchtimeวิธีที่ง่ายกว่าในการเขียนคือ ..

matchtime = ((expiryDate - DateTime.Now).TotalDays < 30);

ตัวดำเนินการ ternary ที่นี่ซ้ำซ้อนอย่างสมบูรณ์เนื่องจาก ((expiryDate - DateTime.Now) TotalDays <30) ส่งคืนบูลีนแล้ว
Fabio

@Fabio ขอบคุณบัดดี้ลบออกเพื่อกำหนดค่าบูลีนผ่านประเภทการส่งคืน
Magic Mick

0

ไม่ฟังก์ชันเปรียบเทียบจะส่งคืน 1, 0 หรือ -1 0 เมื่อทั้งสองค่าเท่ากัน -1 และ 1 หมายถึงน้อยกว่าและมากกว่าฉันเชื่อในลำดับนั้น แต่ฉันมักจะผสมกัน


0

ไม่คุณใช้ไม่ถูกต้อง

ดูรายละเอียดได้ที่นี่

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");

0

สิ่งที่คุณต้องการทำคือลบ DateTimes สองรายการ (expiryDate และ DateTime.Now) สิ่งนี้จะส่งคืนวัตถุประเภท TimeSpan TimeSpan มีคุณสมบัติเป็น "วัน" เปรียบเทียบตัวเลขนั้นกับ 30 สำหรับคำตอบของคุณ


0

ไม่ถูกต้องลองทำดังนี้:

DateTime expiryDate = DateTime.Now.AddDays(-31);
if (DateTime.Compare(expiryDate, DateTime.Now.AddDays(-30)) < 1)
{
    matchFound = true;
}

0

จริงๆแล้วคำตอบเหล่านี้ไม่ได้ผลสำหรับฉัน ฉันแก้ไขได้โดยทำดังนี้:

  if ((expireDate.Date - DateTime.Now).Days > -30)
  {
    matchFound = true;
  }

เมื่อฉันพยายามทำสิ่งนี้:

matchFound = (expiryDate - DateTime.Now).Days < 30;

วันนี้ 2011-11-14 และวันหมดอายุของฉันคือ 2011-10-17 ฉันได้รับ matchFound นั้น = -28 แทนที่จะเป็น 28 ฉันจึงกลับรายการเช็คล่าสุด


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

1
ไม่ซับซ้อนสักหน่อยเหรอ?
สูงสุด

การกล่าวถึง accountExpireDates อยู่ที่ไหนในคำถาม? คุณคัดลอกวางโซลูชันที่ไม่ดี matchFound ดูเหมือนว่าคุณกำลังผสม Pattern หรือ RegEx Btw คุณต้องหยุดเมื่อพบการแข่งขันหรือยังคงวนซ้ำ แล้วถ้าเป็น -2 ล่ะ? MSDN ไม่ได้บอกว่าค่าที่เป็นไปได้คือ -1, 0 และ 1
Mukus

0

คุณสามารถลองทำสิ่งนี้:

var daysPassed = (DateTime.UtcNow - expiryDate).Days;
if (daysPassed > 30)
{ 
    // ...
}

6
โปรดพยายามอธิบายเพิ่มเติมในคำอธิบายของคุณ
borchvm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.