จะตรวจสอบวันนี้ได้อย่างไรว่า DateTime เกิดขึ้นหรือไม่?


110

มีวิธีที่ดีกว่า. net ในการตรวจสอบว่า DateTime เกิดขึ้น 'today' ตามรหัสด้านล่างหรือไม่?

if ( newsStory.WhenAdded.Day == DateTime.Now.Day &&
     newsStory.WhenAdded.Month == DateTime.Now.Month &&
     newsStory.WhenAdded.Year == DateTime.Now.Year )
{ 
    // Story happened today
}
else
{ 
    // Story didn't happen today
}

14
คุณสามารถเปรียบเทียบ newStory.Date == DateTime.Now.Date
Guillaume

คำตอบ:


222
if (newsStory.WhenAdded.Date == DateTime.Today)
{

}
else
{

}

ควรทำเคล็ดลับ


3
... หาก newsStory.Date เป็นเพียงส่วนวันที่โดยไม่มีเวลา ;)
Lucero

14
... ซึ่งก็คือถ้า newsStory เป็น DateTime
stevemegson

18
ดี DateTime เป็นส่วนหนึ่งของ NET Framework ไลบรารีคลาสดังนั้นในขณะที่มันเป็นไปได้ที่ OP สร้างระดับของตัวเองที่เกิดขึ้นเพื่อแบ่งปันชื่อเดียวกันที่คุณจะต้องแปลกใจว่าทำไมเขาจะถาม StackOverflow วิธีการใช้ชั้นเอง เขาสร้างและคาดหวังให้เรารู้อย่างน่าอัศจรรย์ว่ามันทำงานอย่างไร ;)
Brian Schroth

2
@Lucero เป็นไปได้ แต่ชื่อคำถามอ่านว่า 'two DateTimes' ;) ฉันเดาว่านั่นคือสิ่งที่เราได้รับประเภทที่ขาดหายไปจาก
pyrocumulus

1
@HansPetterNaumann นั่นคือตรรกะ :) DateTime.AddHours () ส่งคืนอ็อบเจ็กต์ DateTime ใหม่ซึ่งจะยกเลิกการดำเนินการ. วันนี้ของคุณได้อย่างมีประสิทธิภาพซึ่งไม่มีส่วนประกอบของเวลา
pyrocumulus

29
if( newsStory.Date == DateTime.Today )
{
    // happened today
}

5
ฉันอยากจะเพิ่มมันเป็นเรื่องธรรมดามาก (และยากที่จะสังเกตเห็นจุดบกพร่อง) - เพียงแค่เปรียบเทียบ DateTime กับ DateTime.Today
JL.


14

วิธีแก้ปัญหาของฉัน:

private bool IsTheSameDay(DateTime date1, DateTime date2)
{
    return (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear);
}

7

ถ้า NewsStory ใช้ DateTime ด้วยให้เปรียบเทียบคุณสมบัติ Date เท่านี้ก็เสร็จแล้ว

อย่างไรก็ตามขึ้นอยู่กับความหมายที่แท้จริงของ "วันนี้" หากสิ่งที่โพสต์ก่อนเที่ยงคืนไม่นานสิ่งนั้นจะ "เก่า" หลังจากนั้นไม่นาน ดังนั้นอาจเป็นการดีที่สุดที่จะเก็บวันที่ของเรื่องราวที่แน่นอนไว้ (รวมถึงเวลาโดยเฉพาะอย่างยิ่ง UTC) และตรวจสอบว่าเวลาผ่านไปน้อยกว่า 24 ชั่วโมง (หรืออะไรก็ตาม) ซึ่งเป็นเรื่องง่าย (สามารถลบวันที่ได้ซึ่งจะทำให้คุณมี TimeSpan ด้วย TotalHours หรือคุณสมบัติ TotalDays)


5

คุณสามารถใช้วิธีการขยาย DateTime

สร้างคลาสใหม่สำหรับวิธีการขยายของคุณ:

namespace ExtensionMethods
{
    public static class ExtensionMethods
    {
        public static bool IsSameDay( this DateTime datetime1, DateTime datetime2 )
        {
            return datetime1.Year == datetime2.Year 
                && datetime1.Month == datetime2.Month 
                && datetime1.Day == datetime2.Day;
        }
    }
}

และตอนนี้ทุกที่ในโค้ดของคุณคุณต้องการทำการทดสอบนี้ที่ไหนคุณควรรวมการใช้:

using ExtensionMethods;

จากนั้นใช้วิธีการขยาย:

newsStory.WhenAdded.IsSameDay(DateTime.Now);

3
ทำไมไม่คืนค่า datetime1.Date == datetime2.Date ล่ะ
Sergiu Mindras

@SergiuMindras พูดถูกมันก็เพียงพอแล้วที่จะเปรียบเทียบทั้งคู่DateเพราะมันTimeSpanจะเป็น 00:00:00 เสมอ
GoRoS

5

FYI,

newsStory.Date == DateTime.Today

จะส่งคืนผลการเปรียบเทียบเดียวกันกับการเข้ารหัส

newsStory == DateTime.Today

วัตถุnewsStoryอยู่ที่ไหนDateTime

.NET ฉลาดพอที่จะกำหนดว่าคุณต้องการเปรียบเทียบตามวันที่เท่านั้นและใช้สิ่งนั้นสำหรับการเปรียบเทียบภายใน ไม่แน่ใจว่าทำไมและมีปัญหาในการค้นหาเอกสารสำหรับพฤติกรรมนี้




1

DateTime มีคุณสมบัติ "Date" และคุณสามารถเปรียบเทียบได้ตามนั้น แต่เมื่อดูเอกสารดูเหมือนว่าการได้รับคุณสมบัตินั้นจะสร้างอินสแตนซ์วันที่และเวลาใหม่โดยตั้งค่าส่วนประกอบเวลาเป็นเที่ยงคืนดังนั้นจึงอาจช้ากว่าการเข้าถึงแต่ละองค์ประกอบแม้ว่าจะสะอาดกว่าและอ่านได้ง่ายกว่าก็ตาม


ฉันคิดว่าการชะลอตัว (ถ้ามี) จะน้อยมากมันไม่สำคัญในเกือบทุกกรณี แน่นอนว่าเป็นกรณีของการเพิ่มประสิทธิภาพก่อนกำหนด
Esben Skov Pedersen

เห็นด้วย - ทุกวันนี้ฉันพบว่ามันยากขึ้นเรื่อย ๆ ที่จะยกเลิกการเพิ่มประสิทธิภาพก่อนเวลาอันควรเนื่องจากโลกของการเขียนโค้ดสมัยใหม่เกี่ยวข้องกับความสามารถในการอ่านและการบำรุงรักษามากขึ้น นิสัยเก่าตายยาก!
Peter Bridger


-4

เกี่ยวกับ

if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
{ // Story happened today
}

แต่สิ่งนี้จะกลับมาเป็นจริงสำหรับวันที่ 1 มกราคม 2008 และ 1 มกราคม 2009 ซึ่งอาจเป็นหรือไม่เป็นอย่างที่คุณต้องการก็ได้


-6

คุณสามารถใช้ DateTime.Now.DayOfYear

 if (newsStory.DayOfYear == DateTime.Now.DayOfYear)
 { // story happened today

 }
 else
 { // story didn't happen today

 }

1
ฉันไม่คิดว่าจะได้ผล ถ้าวันนี้คือ 10/21/2009 และ newsStory คือ 10/21/2008 - มันจะกลับมาเป็นจริง (ฉันไม่ได้คำนึงถึงปีอธิกสุรทินที่นี่)
Philip Wallace

2
สิ่งนี้จะไม่แบ่งแยกระหว่างปีใหม่ DateTime (2009, 10, 01) .DayOfYear == DateTime ใหม่ (1900, 10, 01) .DayOfYear;
Dave D
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.