วิธีการตรวจสอบว่า NSDate วันนี้?


156

วิธีการตรวจสอบว่าเป็นNSDateของวันนี้?

ผมใช้ในการตรวจสอบการใช้ครั้งแรก 10 [aDate description]ตัวอักษรจาก [[aDate description] substringToIndex:10]กลับสตริงเช่นดังนั้นฉันเทียบสตริงกับสตริงกลับโดย"YYYY-MM-DD"[[[NSDate date] description] substringToIndex:10]

มีวิธีการตรวจสอบที่รวดเร็วและ / หรือเป็นระเบียบมากกว่านี้

ขอบคุณ


ฉันเชื่อว่าวิธีการของฉันเป็นเพียงวิธีเดียว (ตามที่ฉันเขียนนี้) ซึ่งอ้างอิงถึงเอกสารของ Apple จริง ๆ และทำตามที่พวกเขาแนะนำภายในเพื่อตรวจสอบว่าสองวันเหมือนกันหรือไม่ แม้ว่าวิธีการอื่นอาจใช้งานได้ แต่ฉันเชื่อว่าวิธีการของฉันเป็นหลักฐานในอนาคตที่สุด stackoverflow.com/a/17641925/901641
ArtOfWarfare

@ArtOfWarfare: ฉันไม่เห็นด้วย รหัสของคุณยังคงต้องจัดการกับช่วงเวลา แต่แอปเปิลมีวิธีการที่แตกต่างออกไป - ดู: stackoverflow.com/a/17642033/106435
vikingosegundo

1
เมธอด NSDate "description" แสดงวันที่ในรูปแบบ UTC นั่นคือเวลามาตรฐานกรีนิชโดยไม่มีการแก้ไขเวลาออมแสง หากคุณมาสายตอนเย็นในสหรัฐอเมริกาหรือตอนเช้าในอินเดียมันจะไม่แสดงสิ่งที่ "วันนี้" ตามปฏิทินของคุณ คุณต้องการวัตถุ NSCalendar เพื่อแปล NSDate เป็นวันและเพื่อแปลงวันที่ปัจจุบันเป็นวันจากนั้นเปรียบเทียบ
gnasher729

คำตอบ:


308

ใน macOS 10.9+ และ iOS 8+ มีวิธีการใน NSCalendar / ปฏิทินที่ทำสิ่งนี้!

- (BOOL)isDateInToday:(NSDate *)date 

คุณก็แค่ทำ

Objective-C:

BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];

สวิฟท์ 3:

let today = Calendar.current.isDateInToday(date)

1
ตรวจสอบการใช้ iOS 8 SDK
Catfish_Man

1
ฉันสับสนกับความคิดเห็นข้างต้นนี่เป็น iOS 8: - (BOOL) isDateInToday: (NSDate *) วันที่ NS_AVAILABLE (10_9, 8_0);
powerj1984

ใช่นั่นคือสิ่งที่ฉันพูด ผู้แสดงความคิดเห็นก่อนหน้านี้สับสนโดยดูที่ iOS 7 SDK น่าจะเป็น มันมีคำประกาศต่าง ๆ
Catfish_Man

สำหรับ 'วันนี้' นี่คือคำตอบที่สมบูรณ์แบบ :)
Daij-Djan

คำตอบที่ยอดเยี่ยม!
Supertecnoboff

192

คุณสามารถเปรียบเทียบองค์ประกอบของวันที่:

NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
if([today day] == [otherDay day] &&
   [today month] == [otherDay month] &&
   [today year] == [otherDay year] &&
   [today era] == [otherDay era]) {
    //do stuff
}

แก้ไข:

ฉันชอบวิธีการของสเตฟานมากขึ้นฉันคิดว่ามันเป็นวิธีที่สะอาดขึ้นและเข้าใจได้มากกว่าถ้ามีคำสั่ง:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:aDate];
NSDate *otherDate = [cal dateFromComponents:components];

if([today isEqualToDate:otherDate]) {
    //do stuff
}

คริสฉันได้รวมข้อเสนอแนะของคุณ ฉันต้องค้นหาว่ายุคไหนดังนั้นสำหรับคนอื่นที่ไม่รู้จักมันแยกแยะระหว่าง BC และ AD นี่อาจไม่จำเป็นสำหรับคนส่วนใหญ่ แต่มันง่ายต่อการตรวจสอบและเพิ่มความมั่นใจดังนั้นฉันจึงรวมมันไว้ด้วย หากคุณต้องการความรวดเร็วอาจเป็นวิธีที่ดีอยู่ดี


ทราบเช่นเดียวกับคำตอบมากมายใน SO หลังจาก 7 ปีนี้ล้าสมัยไปแล้ว ในสวิฟท์ตอนนี้ใช้.isDateInToday


1
ขอบคุณ ฉันคิดว่ามันเป็นทางออกที่ดีกว่าและปลอดภัยกว่าสำหรับอนาคต
ซึงฮุน

1
ฉันคิดว่าคุณต้องรวมองค์ประกอบยุคด้วย ฉันคิดว่ามันเป็นการโยนเหรียญระหว่างสองวิธี isEqualToDate ดูดีขึ้น แต่ดูเหมือนว่าจะสิ้นเปลืองเพียงเล็กน้อยและใช้จำนวนบรรทัดเดียวกันในการสร้างวันที่ใหม่จากส่วนประกอบ
Chris หน้า

1
เนื่องจากทั้ง "otherDay" และ "วันนี้" มีเพียงสี่ช่องเท่านั้นที่กรอกข้อมูล (นั่นคือทั้งหมดที่คุณร้องขอ) คุณสามารถใช้ [วันนี้เท่ากับ: otherDay] โดยไม่กระโดดห่วงในช่องที่สอง
Glenn Maynard

@Glenn คุณแนะนำให้ฉันเปรียบเทียบ NSDateComponents ในอันแรกหรือไม่? ฉันไม่ได้คิดถึงเรื่องนั้นจริงๆ แต่มันก็เป็นความคิดที่ดีเช่นกัน
David Kanarek

1
@DavidKanarek กำลังขุดโพสต์เก่า ๆ ... ฉันไม่แนะนำให้เปรียบเทียบส่วนประกอบของวันที่โดยตรงหากคุณเข้าสู่สถานการณ์ที่คุณต้องการชดเชยหนึ่งในองค์ประกอบคุณอาจได้รับเดือน == 3 วัน == 34 การแปลงวันที่อย่างถูกต้องจะตีความสิ่งนี้เป็นวันที่ 3 เมษายนการเปรียบเทียบส่วนประกอบของวันที่จะไม่เห็นสิ่งนี้เหมือนกับเดือน == 4, วัน == 3
Sean Kladek

27

นี่คือการลดคำถามของคุณ แต่ถ้าคุณต้องการพิมพ์ NSDate ด้วย "วันนี้" หรือ "เมื่อวาน" ให้ใช้ฟังก์ชัน

- (void)setDoesRelativeDateFormatting:(BOOL)b

สำหรับ NSDateFormatter


3
ความคิดที่ฉลาด แต่ฉันคิดว่าการหาสตริง "วันนี้" จะแตกถ้าคุณ จำกัด
Basil Bourque

16

ฉันจะลองดูวันที่วันนี้เป็นปกติถึงเที่ยงคืนและวันที่สองเป็นปกติถึงเที่ยงคืนแล้วเปรียบเทียบว่าเป็น NSDate เดียวกันหรือไม่

จากตัวอย่างของ Appleนี่เป็นวิธีที่คุณปรับมาตรฐานเป็นเที่ยงคืนของวันนี้ทำแบบเดียวกันกับวันที่สองแล้วเปรียบเทียบ

NSCalendar * gregorian = [[NSCalendar alloc]
                               initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * components =
    [gregorian components:
                 (NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
                 fromDate:[NSDate date]];
NSDate * today = [gregorian dateFromComponents:components];

ฉันคิดว่าคุณต้องรวมยุคด้วย
Chris หน้า

ไม่ควรกำหนดวันที่เป็นมาตรฐานด้วยการตั้งเวลาเป็น 12 เช่นเที่ยงวันไม่ใช่เที่ยงคืนใช่หรือไม่ เนื่องจากวันที่อยู่ใน GMT การตั้งค่าเป็นเวลาเที่ยงทำให้แน่ใจได้ว่าเขตเวลามีการเปลี่ยนแปลงทั้งสองวิธี (และพวกเขาไปถึง 12 ชั่วโมงเท่านั้นทั้งสองวิธี) จะไม่ 'กระโดด' ลงในวันก่อนหรือหลัง
artooras


12

ไม่จำเป็นต้องเล่นกลกับส่วนประกอบยุคและเนื้อหา

NSCalendar มีวิธีการเริ่มต้นหน่วยเวลาสำหรับวันที่มีอยู่

รหัสนี้จะเริ่มต้นวันนี้และวันที่อื่นและเปรียบเทียบ หากประเมินเป็นNSOrderedSameวันที่ทั้งสองจะอยู่ในช่วงวันเดียวกันดังนั้นวันนี้

NSDate *today = nil;
NSDate *beginningOfOtherDate = nil;

NSDate *now = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&today interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfOtherDate interval:NULL forDate:beginningOfOtherDate];

if([today compare:beginningOfOtherDate] == NSOrderedSame) {
    //otherDate is a date in the current day
}

9
extension NSDate {
  func isToday() -> Bool {
    let cal = NSCalendar.currentCalendar()
    var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let today = cal.dateFromComponents(components)!

    components = cal.components([.Era, .Year, .Month, .Day], fromDate:self)
    let otherDate = cal.dateFromComponents(components)!

    return today.isEqualToDate(otherDate)
}

ทำงานให้ฉันใน Swift 2.0


6

คำตอบที่ดีที่สุดของ Swift version:

let cal = NSCalendar.currentCalendar()
var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
let today = cal.dateFromComponents(components)!

components = cal.components([.Era, .Year, .Month, .Day], fromDate:aDate);
let otherDate = cal.dateFromComponents(components)!

if(today.isEqualToDate(otherDate)) {
    //do stuff
}

5

อ้างถึงรายการแอปเปิ้ลของเอกสารชื่อ "การคำนวณปฏิทิน" [ลิงค์]

รายชื่อ 13 ในหน้านั้นแสดงให้เห็นว่าในการกำหนดจำนวนเที่ยงคืนระหว่างวันคุณใช้:

- (NSInteger)midnightsFromDate:(NSDate *)startDate toDate:(NSDate *)endDate
{
    NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
    NSInteger startDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
                                             inUnit:NSEraCalendarUnit
                                            forDate:startDate];
    NSInteger endDay = [calendar ordinalityOfUnit:NSDayCalendarUnit
                                           inUnit:NSEraCalendarUnit
                                          forDate:endDate];
    return endDay - startDay;
}

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


2
โปรดจำไว้ว่ายุคเริ่มต้นที่ 00:00 GMT! วิธีนี้อาจทำงานไม่ถูกต้องหากหนึ่งในวันที่ (หรือทั้งสองอย่าง) ไม่อยู่ในเขตเวลา GMT
Andreas Ley

5

คุณสามารถตรวจสอบช่วงเวลาระหว่างวันที่คุณมีและวันที่ปัจจุบัน:

[myDate timeIntervalSinceNow]

นี่จะให้ช่วงเวลาเป็นวินาทีระหว่าง myDate และวันที่ / เวลาปัจจุบัน

ลิงค์

แก้ไข: หมายเหตุสำหรับทุกคน: ฉันตระหนักดีว่า [myDate timeIntervalSinceNow] ไม่ได้ระบุว่า myDate วันนี้อย่างชัดเจนหรือไม่

ฉันออกจากคำตอบนี้เพื่อที่ว่าหากใครบางคนกำลังมองหาบางสิ่งที่คล้ายกันและ [เวลาวันของฉันช่วงเวลาทันที] มีประโยชน์พวกเขาอาจพบได้ที่นี่


1
สิ่งที่คุณพูดนั้นถูกต้อง แต่ช่วงเวลานั้นไม่ได้ช่วยตรวจสอบว่าวันที่เป็นวันนี้หรือไม่
Jaanus

3
เพียงจำไว้ว่านี่คือสิ่งที่บอกคุณหากคุณอยู่ภายใน 24 ชั่วโมงนับจากนี้ แต่ไม่ใช่หากวันที่เหมือนกัน ความแตกต่างหนึ่งวินาทีสามารถเป็นวันที่แตกต่างกันและความแตกต่างที่สอง 86399 สามารถเป็นวันที่เดียวกัน
David Kanarek

@David: จริง ไม่ได้คิดอย่างนั้นขณะที่ฉันกำลังทำ 3 สิ่งอื่น ๆ ในขณะที่ตอบคำถามและคำตอบของคุณไม่ได้ถูกโพสต์เมื่อฉันโหลดหน้าเว็บ
alesplin

1
นี่ไม่ได้ตอบคำถามเลย คุณควรลบทิ้ง
vikingosegundo

1
คำตอบนี้ไม่มีอะไรนอกจากเสียงรบกวน มันไม่ได้พยายามตอบคำถามหรือไม่จำเป็นต้องอ้างถึงtimeIntervalSinceNowเพราะมันครอบคลุมในการโพสต์อื่น ๆ อีกมากมาย นอกจากนี้การจัดการเปรียบเทียบวันด้วยการตรวจสอบวินาทีสนับสนุนการหารข้อผิดพลาดได้ง่ายโดย 86400
vikingosegundo

4

Swift Extension จากคำตอบที่ดีที่สุด:

extension NSDate {
    func isToday() -> Bool {
        let cal = NSCalendar.currentCalendar()
        if cal.respondsToSelector("isDateInToday:") {
            return cal.isDateInToday(self)
        }
        var components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:NSDate())
        let today = cal.dateFromComponents(components)!

        components = cal.components((.CalendarUnitEra | .CalendarUnitYear | .CalendarUnitMonth | .CalendarUnitDay), fromDate:self);
        let otherDate = cal.dateFromComponents(components)!
        return today.isEqualToDate(otherDate)
    }
}

2

หากคุณมีการเปรียบเทียบวันที่เหล่านี้จำนวนมากดังนั้นการโทรเพื่อcalendar:components:fromDateเริ่มต้นใช้เวลานานมาก ตามที่ฉันทำโปรไฟล์ดูเหมือนว่าพวกเขาจะค่อนข้างแพง

สมมติว่าคุณกำลังพยายามที่จะกำหนดว่าวันใดบ้างเรียงจากวันที่NSArray *datesToCompareเป็นวันเดียวกับวันที่กำหนดให้พูดNSDate *baseDateจากนั้นคุณสามารถใช้สิ่งต่อไปนี้ (ดัดแปลงมาจากคำตอบข้างบน):

NSDate *baseDate = [NSDate date];

NSArray *datesToCompare = [NSArray arrayWithObjects:[NSDate date], 
                           [NSDate dateWithTimeIntervalSinceNow:100],
                           [NSDate dateWithTimeIntervalSinceNow:1000],
                           [NSDate dateWithTimeIntervalSinceNow:-10000],
                           [NSDate dateWithTimeIntervalSinceNow:100000],
                           [NSDate dateWithTimeIntervalSinceNow:1000000],
                           [NSDate dateWithTimeIntervalSinceNow:50],
                           nil];

// determine the NSDate for midnight of the base date:
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDateComponents* comps = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) 
                                       fromDate:baseDate];
NSDate* theMidnightHour = [calendar dateFromComponents:comps];

// set up a localized date formatter so we can see the answers are right!
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];

// determine which dates in an array are on the same day as the base date:
for (NSDate *date in datesToCompare) {
    NSTimeInterval interval = [date timeIntervalSinceDate:theMidnightHour];
    if (interval >= 0 && interval < 60*60*24) {
        NSLog(@"%@ is on the same day as %@", [dateFormatter stringFromDate:date], [dateFormatter stringFromDate:baseDate]);
    }
    else {
        NSLog(@"%@ is NOT on the same day as %@", [dateFormatter stringFromDate:date], [dateFormatter stringFromDate:baseDate]);
    }
}

เอาท์พุท:

Nov 23, 2011 1:32:00 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:33:40 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:48:40 PM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 10:45:20 AM is on the same day as Nov 23, 2011 1:32:00 PM
Nov 24, 2011 5:18:40 PM is NOT on the same day as Nov 23, 2011 1:32:00 PM
Dec 5, 2011 3:18:40 AM is NOT on the same day as Nov 23, 2011 1:32:00 PM
Nov 23, 2011 1:32:50 PM is on the same day as Nov 23, 2011 1:32:00 PM

ขอบคุณสำหรับสิ่งนี้. วิธีที่ได้รับการยอมรับนั้นเป็นวิธีที่ใช้ CPU มากเกินไปสำหรับแอปของเราดังนั้นเราจึงจำเป็นต้องปรับให้เหมาะสม
Accatyyc

1
รหัสนี้จะล้มเหลวในการปรับเวลาตามฤดูกาล ทุกคนที่ใช้รหัสที่มีหมายเลขที่น่าอับอาย 86,400 สมควรได้รับอาการปวดหัวที่อาจเกิดขึ้น
vikingosegundo

2

มีวิธีที่ง่ายกว่าคำตอบข้างต้นมากมาย!

NSDate *date = ... // The date you wish to test
NSCalendar *calendar = [NSCalendar currentCalendar];

if([calendar isDateInToday:date]) {
    //do stuff
}

1
เหมือนกับคำตอบของ Catfish_Man!
Thanh Pham

0

นี่อาจเป็น reworked เป็นหมวดหมู่ NSDate แต่ฉันใช้:

// Seconds per day (24h * 60m * 60s)
#define kSecondsPerDay 86400.0f

+ (BOOL) dateIsToday:(NSDate*)dateToCheck
{
    // Split today into components
    NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* comps = [gregorian components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit) 
                                        fromDate:[NSDate date]];

    // Set to this morning 00:00:00
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    NSDate* theMidnightHour = [gregorian dateFromComponents:comps];
    [gregorian release];

    // Get time difference (in seconds) between date and then
    NSTimeInterval diff = [dateToCheck timeIntervalSinceDate:theMidnightHour];
    return ( diff>=0.0f && diff<kSecondsPerDay );
}

(อย่างไรก็ตามการเปรียบเทียบสตริงวันที่ทั้งสองในคำถามเดิมเกือบจะรู้สึก 'สะอาด' .. )


เหตุใดจึงรวมชั่วโมงนาทีและวินาทีเมื่อสร้างcompsเมื่อคุณตั้งค่าเป็นศูนย์ทันที นอกจากนี้ฉันคิดว่าคุณต้องรวมยุค
Chris Page

โปรดทราบว่าในขณะนี้จะใช้งานได้ในเกือบทุกกรณี ฉันไม่ทราบว่าแอปเปิ้ล NSDate มีระดับอย่างไร แต่ก็มีโอกาสที่จะไม่สามารถใช้งานได้ นี่เป็น "คุณรู้" มากกว่าการวิจารณ์วิธีการของคุณเพราะพวกเขาหายากมาก (24 ในประวัติศาสตร์)
David Kanarek

แล้ววันที่ไหนที่ไม่ยาว 24 ชั่วโมง แต่ 23 หรือ 25 อันเนื่องมาจากการปรับเวลาตามฤดูกาล
vikingosegundo

0

สำหรับ iOS7 และก่อนหน้านี้:

//this is now => need that for the current date
NSDate * now = [NSDate date];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[calendar setTimeZone:[NSTimeZone systemTimeZone]];

NSDateComponents * components = [calendar components:( NSYearCalendarUnit|    NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: now];

[components setMinute:0];
[components setHour:0];
[components setSecond:0];

//this is Today's Midnight
NSDate *todaysMidnight = [calendar dateFromComponents: components];



//now timeIntervals since Midnight => in seconds
NSTimeInterval todayTimeInterval = [now timeIntervalSinceDate: todaysMidnight];

//now timeIntervals since OtherDate => in seconds
NSTimeInterval otherDateTimeInterval = [now timeIntervalSinceDate: otherDate];

if(otherDateTimeInterval > todayTimeInterval) //otherDate is not in today
{
    if((otherDateTimeInterval - todayTimeInterval) <= 86400) //86400 == a day total seconds
    {
        @"yesterday";
    }
    else
    {
        @"earlier";
    }
}
else
{
    @"today";
}


now = nil;
calendar = nil;
components = nil;
todaysMidnight = nil;

NSLog("Thank you :-)");


0

โซลูชันที่ถูกต้องและปลอดภัยโดยไม่ต้องบังคับเปิดเครื่องทำงานกับ Swift 2.2 และก่อน iOS 8:

func isToday() -> Bool {
    let calendar = NSCalendar.currentCalendar()
    if #available(iOS 8.0, *) {
        return calendar.isDateInToday(self)
    }

    let todayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let dayComponents = calendar.components([.Era, .Year, .Month, .Day], fromDate:self)

    guard let today = calendar.dateFromComponents(todayComponents),
        day = calendar.dateFromComponents(dayComponents) else {
        return false
    }

    return today.compare(day) == .OrderedSame
}

-1

ต่อไปนี้เป็นคำตอบที่สร้างขึ้น 2 เซ็นต์ของฉันสำหรับคำตอบที่ยอมรับ แต่สนับสนุน API ที่ใหม่กว่าด้วย หมายเหตุ: ฉันใช้ปฏิทินแบบคริสต์ศักราชเนื่องจากการประทับเวลาส่วนใหญ่เป็น GMT แต่คุณเปลี่ยนได้ตามที่เห็นสมควร

func isDateToday(date: NSDate) -> Bool {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    if calendar.respondsToSelector("isDateInToday:") {
        return calendar.isDateInToday(date)
    }
    let dateComponents = NSCalendarUnit.CalendarUnitYear | NSCalendarUnit.CalendarUnitMonth | NSCalendarUnit.CalendarUnitDay
    let today = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: NSDate()))!
    let dateToCompare = calendar.dateFromComponents(calendar.components(dateComponents, fromDate: date))!

    return dateToCompare == today
}

-3

คำตอบของฉันคือการคำนวณจำนวนวันที่ผ่านไปตั้งแต่ปี 1970 โดยการหารและเปรียบเทียบส่วนจำนวนเต็ม

#define kOneDay (60*60*24)
- (BOOL)isToday {
  NSInteger offset = [[NSTimeZone defaultTimeZone] secondsFromGMT];

  NSInteger days =[self timeIntervalSince1970] + offset;
  NSInteger currentDays = [[NSDate date] timeIntervalSince1970] + offset;
  return (days / kOneDay == currentDays / kOneDay);
}

นั่นไม่ใช่ทางออกที่เลวร้ายจริงๆ ไม่แน่ใจว่าทำไมมันลดลงอย่างมาก การใช้การหารจำนวนเต็มจะตัดส่วนที่เหลือและเปรียบเทียบค่า "วัน" ของเวลา unix นานหลังจากแก้ไขสำหรับ GMT ฉันคิดว่านี่เป็นคำตอบที่สะอาดที่สุดของพวกเขาทั้งหมดที่ค่อนข้างเปิดเผย
devios1

1
@chaiguy: นี่เป็นวิธีแก้ปัญหาที่แย่เพราะถือว่าทุกวันมีความยาว 24 ชั่วโมง - มันไม่ใช่อย่างนั้น เนื่องจากเวลาออมแสงตามฤดูกาลสามารถยาว 23, 24 หรือ 25 ชั่วโมง
vikingosegundo

อืมมันเป็นเรื่องจริง อย่างไรก็ตามค่าเฉลี่ยต่อปีเท่ากับ 24 ชั่วโมงดังนั้นมันอาจจะถูกปิดโดยกรณีที่เลวร้ายที่สุดหนึ่งชั่วโมงเท่านั้นตามที่ฉันเห็น บางทีนั่นอาจถูกตรวจสอบอย่างชัดเจน
devios1

2
@chaiguy: ไม่ ไม่เคยใช้รหัสที่มี 60 * 60 * 24 หรืออยู่กับอาการปวดหัวของคุณ
vikingosegundo

"secondsFromGMT" เปลี่ยนแปลงอย่างรวดเร็วปีละสองครั้งในสถานที่ส่วนใหญ่ในโลก ปลอดภัยกว่าที่จะใช้วิธีการ NSCalendar
gnasher729

-4
NSDate *dateOne = yourDate;
NSDate *dateTwo = [NSDate date];  

switch ([dateOne compare:dateTwo])
{  
    case NSOrderedAscending:  
        NSLog(@”NSOrderedAscending”);  
        break;  

    case NSOrderedSame: 
        NSLog(@”NSOrderedSame”);  
        break;

    case NSOrderedDescending:  
        NSLog(@”NSOrderedDescending”);  
        break;  
}  

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