gibt es eine Möglichkeit zu überprüfen, ob ein NSDate diese Woche ist oder nächste Woche ist?Überprüfen Sie, ob NSDate in dieser Woche oder in der nächsten Woche ist
ich weiß, dass heute ist:
[NSDate date]
und dann, wie kann ich tun?
gibt es eine Möglichkeit zu überprüfen, ob ein NSDate diese Woche ist oder nächste Woche ist?Überprüfen Sie, ob NSDate in dieser Woche oder in der nächsten Woche ist
ich weiß, dass heute ist:
[NSDate date]
und dann, wie kann ich tun?
Verwenden NSDateComponents, etwas in der Art:
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *today = [NSDate date];
NSDateComponents *todaysComponents =
[gregorian components:NSWeekCalendarUnit fromDate:date];
NSUInteger todaysWeek = [todaysComponents week];
NSDate *anotherDate = [NSDate date];
NSDateComponents *otherComponents =
[gregorian components:NSWeekCalendarUnit fromDate:anotherDate];
NSUInteger anotherWeek = [otherComponents week];
if(todaysWeek==anotherWeek){
NSLog(@"another date is this week");
}else if(todaysWeek+1==anotherWeek){
NSLog(@"another date is next week")
}
Sie können auch andere Komponenten wie Monat oder Jahr verwenden, um absolut sicher zu sein.
HINWEIS: Keine timeIntervals verwenden. Mit NSDateComponents ignorieren Sie die Stunden, Minuten und Sekunden. Ich denke du willst das.
vielen dank das ist die beste antwort :), wenn ist die letzte woche des jahres, muss ich mit anderen komponenten überprüfen, um sicher zu sein, richtig? – Piero
Denken Sie genau daran, die Komponenten, die Sie verwenden möchten, so hinzuzufügen: NSDateComponents * todaysComponents = [gregorianische Komponenten: (NSWeekCalendarUnit | NSMonthCalendarUnit) fromDate: date]; dann, hol die Komponenten und vergleiche sie. – Edu
Ok danke, denn wenn ein neues Jahr ist, ist die Nummer der neuen Woche 1 richtig? – Piero
NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:NSWeekCalendarUnit fromDate:yourDate];
NSInteger week = [components week]; // here your have a Integer with the weeknr of yourDate
components = [cal components:NSWeekCalendarUnit fromDate:[NSDate date]];
weekToday = [components week]; // here your have a Integer with the weeknr of today
Der Rest sollten Sie tun können. Es könnte eine andere Kopfarbeit bekommen, wenn es um die letzte Woche im Jahr geht.
Klar?
HINWEIS: Dies berechnet die Idee der "Woche" mit einem Sonntag-Samstag-Konzept der Woche.
Um den aktuellen Tag der Woche verwenden Sie die folgenden von here zu berechnen:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *weekdayComponents =[gregorian components:NSWeekdayCalendarUnit fromDate:dateOfInterest];
NSInteger weekday = [weekdayComponents weekday];
// weekday 1 = Sunday for Gregorian calendar
[gregorian release];
Der Rest ziemlich trivial sein sollte. Holen Sie sich das aktuelle Datum und das Datum von Ihrem NSDate. Finden Sie die Start- und Enddaten unter Verwendung des Tages und des Datums (wenn heute Montag ist, dann ist date - 1 day
der erste Tag der Woche usw.). Herauszufinden, welche Woche der das Datum liegt
danke für die Antwort! – Piero
die 2 Tage, an diese Methode übergeben.
- (BOOL) isSameWeekAsDate: (NSDate *) aDate andDate:(NSDate *) bDate
{
NSDateComponents *components1 = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:aDate];
NSDateComponents *components2 = [[NSCalendar currentCalendar] components:(NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekdayCalendarUnit | NSWeekdayOrdinalCalendarUnit) fromDate:bDate];
if ([components1 week] != [components2 week]) return NO;
//return (abs([self timeIntervalSinceDate:aDate]) < 604800); // ops, forgot to change "self" with parameter "bDate":
return (abs([bDate timeIntervalSinceDate:aDate]) < 604800);
}
EDIT: nennen es mit 2 Daten aus verschiedenen Jahren:
[components setDay:31];
[components setMonth:12];
[components setYear:2010];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *date1 = [gregorian dateFromComponents:components];
// second date (SATURDAY -of the same week, other year...)
[components setDay:1];
[components setMonth:1];
[components setYear:2011];
NSDate *date2 = [gregorian dateFromComponents:components];
if ([self isSameWeekAsDate:date1 andDate:date2]) {
NSLog(@"Same Week!");
}else{
NSLog(@"OTHER WEEK!");
}
Ich bin Hinzufügen meine Lösung (implementiert als NSDate Kategorie), die nicht Woche nicht verwendet, die in iOS7 ist veraltet, iOS8
- (NSDate *)firstDateOfWeek {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startOfWeek;
[calendar rangeOfUnit:NSCalendarUnitWeekOfYear startDate:&startOfWeek interval:NULL forDate:self];
return startOfWeek;
}
- (BOOL)isSameWeekWithDate:(NSDate *)date {
if (ABS(self.timeIntervalSince1970 - date.timeIntervalSince1970) > (7 * 24 * 60 * 60)) {
return NO;
}
return ([[self firstDateOfWeek] timeIntervalSince1970] == [[date firstDateOfWeek] timeIntervalSince1970]);
}
- (BOOL)isThisWeek {
return [self isSameWeekWithDate:[NSDate new]];
}
Für iOS 7 und höher, müssen Sie ersetzen NSWeekCalendarUnit
mit NSCalendarUnitWeekOfYear
- (NSInteger)thisW:(NSDate *)date
{
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *todaysComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:[NSDate date]];
NSUInteger todaysWeek = [todaysComponents weekOfYear];
NSDateComponents *otherComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:date];
NSUInteger datesWeek = [otherComponents weekOfYear];
//NSLog(@"Date %@",date);
if(todaysWeek==datesWeek){
//NSLog(@"Date is in this week");
return 1;
}else if(todaysWeek+1==datesWeek){
//NSLog(@"Date is in next week");
return 2;
} else {
return 0;
}
}
Vergessen Sie aktuelle Komponenten, Sie viele Dinge zwicken (überprüfen, ob es die letzte Woche des Jahres ist, prüfen Sie, ob der Sonntag der Anfang der Woche ist ...) und ist anfällig zu Fehlern und Spaghetti Code.
Dies löst das Problem und erweitert wird „letzte Woche“, „vorige Woche“, „diese Woche“, „nächste Woche“ und „Wochen später“
-(EventWeekRange)numberOfWeeksFromTodayToEvent:(NSDate *)eventDate {
NSCalendar *calendar = [NSCalendar currentCalendar];
NSComparisonResult comparison = [calendar compareDate:[NSDate date] toDate:eventDate toUnitGranularity:NSCalendarUnitWeekOfYear];
if (comparison == NSOrderedSame) {
return RangeThisWeek;
} else if (comparison == NSOrderedAscending) { // The event date is in the future
// Advance today's date one week to check if this new date is in the same week as the event
NSDate *todaysNextWeek = [[NSDate date]dateByAddingTimeInterval:60*60*24*7];
if ([calendar compareDate:todaysNextWeek toDate:eventDate toUnitGranularity:NSCalendarUnitWeekOfYear] == NSOrderedSame) {
return RangeNextWeek;
} else {
return RangeLater;
}
} else { // The event date is in the past
// Advance the event's date one week to check if this new date is in the same week as today
NSDate *eventsNextWeek = [eventDate dateByAddingTimeInterval:60*60*24*7];
if ([calendar compareDate:eventsNextWeek toDate:[NSDate date] toUnitGranularity:NSCalendarUnitWeekOfYear] == NSOrderedSame) {
return RangeLastWeek;
} else {
return RangeEarlier;
}
}
}
zu erkennen Was ist Ihre Definition von Woche? Beginnt es am Sonntag oder nicht? – mydogisbox