У меня есть две даты: 2009-05-11
и текущая дата. Я хочу проверить, является ли данная дата текущей или нет. Как это возможно.Как сравнить две даты в Objective-C
ответ
Вам действительно нужно сравнить два объекта одного и того же типа.
Создание NSDate из вашей даты строки (@ "2009-05-11"):
http://blog.evandavey.com/2008/12/how-to-convert-a-string-to-nsdate.htmlЕсли текущая дата является строкой тоже делают это NSDate. Если это уже NSDate, оставьте его.
Вы не можете сравнить два объекта, используя == – oxigen
свою ошибку, ответили на другой вопрос одновременно. Спасибо, что комментировали это. –
..
NSString *date = @"2009-05-11"
NSString *nowDate = [[[NSDate date]description]substringToIndex: 10];
if([date isEqualToString: nowDate])
{
// your code
}
Я думаю, было бы гораздо полезнее превратить «дату» в объект NSDate, а затем сравнить объекты NSDate. Этот код будет работать, но substringToIndex: 10 действительно взломан. Если вам нужна дополнительная информация, например, какая дата более поздняя, вам тоже нужно будет это сделать. –
Конечно, вы можете сравнить объекты NSDate. Но NSDate имеет информацию о дате и времени . Ваша потребность 1. Создайте NSDate из строки 2. Перейдите на текущую информацию о времени (установленное время до 00:00:00) И только после этого сравните даты. Я думаю, что этот способ нелегкий и быстрый. – oxigen
Если вас интересует только день, вы можете создать NSDates, а затем использовать NSCalendar, чтобы вывести NSDateComponents из него, после чего вы можете количественно сравнить только те значения, которые вам интересны. Вы также можете получить компоненты для номера дней с эпохи, использовать в одном сравнении. –
В какао, чтобы сравнить даты, используйте один из isEqualToDate
, compare
, laterDate
и earlierDate
методы NSDate
объектов, инстанцированный с датами вам нужно.
Документация:
http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDate/isEqualToDate:
http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDate/earlierDate:
http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDate/laterDate:
http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSDate_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDate/compare:
Если вы обе даты NSDate
s вы можете использовать NSDate
«s compare:
метод:
NSComparisonResult result = [Date2 compare:Date1];
if(result==NSOrderedAscending)
NSLog(@"Date1 is in the future");
else if(result==NSOrderedDescending)
NSLog(@"Date1 is in the past")
else
NSLog(@"Both dates are the same");
Вы можете взглянуть в документах here.
Cocoa has couple of methods for this:
в NSDate
– isEqualToDate:
– earlierDate:
– laterDate:
– compare:
При использовании - (NSComparisonResult)compare:(NSDate *)anotherDate
, вы получаете назад один из них:
The receiver and anotherDate are exactly equal to each other, NSOrderedSame
The receiver is later in time than anotherDate, NSOrderedDescending
The receiver is earlier in time than anotherDate, NSOrderedAscending.
пример:
NSDate * now = [NSDate date];
NSDate * mile = [[NSDate alloc] initWithString:@"2001-03-24 10:45:32 +0600"];
NSComparisonResult result = [now compare:mile];
NSLog(@"%@", now);
NSLog(@"%@", mile);
switch (result)
{
case NSOrderedAscending: NSLog(@"%@ is in future from %@", mile, now); break;
case NSOrderedDescending: NSLog(@"%@ is in past from %@", mile, now); break;
case NSOrderedSame: NSLog(@"%@ is the same as %@", mile, now); break;
default: NSLog(@"erorr dates %@, %@", mile, now); break;
}
[mile release];
Как это ответить на исходный вопрос о том, является ли данная дата текущей или нет? [Дата NSDate] будет NSOderedSame на любую фиксированную дату не в течение 24 часов, но менее чем за секунду. – Chei
Это не работает для iOS. См. Принятый ответ: http://stackoverflow.com/questions/14702626/no-visible-interface-for-nsdate-declares-the-selector-initwithstring –
@HappyFlow вопрос помечен 'cocoa', он не упоминает iOS, для получения дополнительной информации попробуйте google «cocoa» против «cocoa touch» – stefanB
Здесь дружище. Эта функция будет соответствовать вашей дате с любой указанной датой и будет сообщать о погоде, которую они соответствуют или нет. Вы также можете изменить компоненты в соответствии с вашими требованиями.
- (BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 {
NSCalendar* calendar = [NSCalendar currentCalendar];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];
return [comp1 day] == [comp2 day] &&
[comp1 month] == [comp2 month] &&
[comp1 year] == [comp2 year];}
С уважением, Навид Butt
NSDate *today = [NSDate date]; // it will give you current date
NSDate *newDate = [NSDate dateWithString:@"xxxxxx"]; // your date
NSComparisonResult result;
//has three possible values: NSOrderedSame,NSOrderedDescending, NSOrderedAscending
result = [today compare:newDate]; // comparing two dates
if(result==NSOrderedAscending)
NSLog(@"today is less");
else if(result==NSOrderedDescending)
NSLog(@"newDate is less");
else
NSLog(@"Both dates are same");
Есть и другие способы, которые вы можете использовать, чтобы сравнить объекты NSDate. Каждый из методов будет более эффективным при выполнении определенных задач. Я выбрал метод сравнения , потому что он будет обрабатывать большинство ваших основных потребностей сравнения даты.
NSDateFormatter *df= [[NSDateFormatter alloc] init];
[df setDateFormat:@"yyyy-MM-dd"];
NSDate *dt1 = [[NSDate alloc] init];
NSDate *dt2 = [[NSDate alloc] init];
dt1=[df dateFromString:@"2011-02-25"];
dt2=[df dateFromString:@"2011-03-25"];
NSComparisonResult result = [dt1 compare:dt2];
switch (result)
{
case NSOrderedAscending: NSLog(@"%@ is greater than %@", dt2, dt1); break;
case NSOrderedDescending: NSLog(@"%@ is less %@", dt2, dt1); break;
case NSOrderedSame: NSLog(@"%@ is equal to %@", dt2, dt1); break;
default: NSLog(@"erorr dates %@, %@", dt2, dt1); break;
}
Наслаждайтесь кодированием ......
Лучший способом я нашел, чтобы проверить разницу между указанной датой и сегодня:
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* now = [NSDate date];
int differenceInDays =
[calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:date] -
[calendar ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:now];
Согласно листингу 13 из Calendrical Calculations в компании Apple Date and Time Programming Guide [NSCalendar ordinalityOfUnit: NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate: MyDate] дает вы число полуночи с начала эры. Таким образом, легко проверить, является ли дата вчера, сегодня или завтра.
switch (differenceInDays) {
case -1:
dayString = @"Yesterday";
break;
case 0:
dayString = @"Today";
break;
case 1:
dayString = @"Tomorrow";
break;
default: {
NSDateFormatter* dayFormatter = [[NSDateFormatter alloc] init];
[dayFormatter setLocale:usLocale];
[dayFormatter setDateFormat:@"dd MMM"];
dayString = [dayFormatter stringFromDate: date];
break;
}
}
This категория предлагает аккуратный способ сравнения NSDates:
#import <Foundation/Foundation.h>
@interface NSDate (Compare)
-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
//- (BOOL)isEqualToDate:(NSDate *)date; already part of the NSDate API
@end
И реализации:
#import "NSDate+Compare.h"
@implementation NSDate (Compare)
-(BOOL) isLaterThanOrEqualTo:(NSDate*)date {
return !([self compare:date] == NSOrderedAscending);
}
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date {
return !([self compare:date] == NSOrderedDescending);
}
-(BOOL) isLaterThan:(NSDate*)date {
return ([self compare:date] == NSOrderedDescending);
}
-(BOOL) isEarlierThan:(NSDate*)date {
return ([self compare:date] == NSOrderedAscending);
}
@end
Простой в использовании:
if([aDateYouWantToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now
{
// do your thing ...
}
спасибо! Это намного лучше, чем код с NSComparisonResults - непонятным для дат - прямо в нем. –
довольно круто !!! – BlaShadow
Apple должна рассмотреть возможность реализации этого. Намного легче, чем создавать операторы switch для более ранних или равных и более поздних или равных. – geekinit
По этому методу также вы можете compa повторно двумя датами
NSDate * dateOne = [NSDate date];
NSDate * dateTwo = [NSDate date];
if([dateOne compare:dateTwo] == NSOrderedAscending)
{
}
Интересными константами для сравнения могут быть: 'NSOrderedAscending',' NSOrderedSame' и 'NSOrderedDescending', но OP, вероятно, хочет' NSOrderedSame' для своей конкретной проблемы. – Kris
Вот вариант Swift на ответ Паскаля:
extension NSDate {
func isLaterThanOrEqualTo(date:NSDate) -> Bool {
return !(self.compare(date) == NSComparisonResult.OrderedAscending)
}
func isEarlierThanOrEqualTo(date:NSDate) -> Bool {
return !(self.compare(date) == NSComparisonResult.OrderedDescending)
}
func isLaterThan(date:NSDate) -> Bool {
return (self.compare(date) == NSComparisonResult.OrderedDescending)
}
func isEarlierThan(date:NSDate) -> Bool {
return (self.compare(date) == NSComparisonResult.OrderedAscending)
}
}
который может быть использован как:
self.expireDate.isEarlierThanOrEqualTo(NSDate())
Вот функция от ответа Naveed Rafi «s преобразуется в Swift, если кто-либо еще ищет:
func isSameDate(#date1: NSDate, date2: NSDate) -> Bool {
let calendar = NSCalendar()
let date1comp = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date1)
let date2comp = calendar.components(.YearCalendarUnit | .MonthCalendarUnit | .DayCalendarUnit, fromDate: date2)
return (date1comp.year == date2comp.year) && (date1comp.month == date2comp.month) && (date1comp.day == date2comp.day)
}
Get Today's Date:
NSDate* date = [NSDate date];
Create a Date From Scratch:
NSDateComponents* comps = [[NSDateComponents alloc]init];
comps.year = 2015;
comps.month = 12;
comps.day = 31;
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* date = [calendar dateFromComponents:comps];
Add a day to a Date:
NSDate* date = [NSDate date];
NSDateComponents* comps = [[NSDateComponents alloc]init];
comps.day = 1;
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* tomorrow = [calendar dateByAddingComponents:comps toDate:date options:nil];
Subtract a day from a Date:
NSDate* date = [NSDate date];
NSDateComponents* comps = [[NSDateComponents alloc]init];
comps.day = -1;
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* yesterday = [calendar dateByAddingComponents:comps toDate:date options:nil];
Convert a Date to a String:
NSDate* date = [NSDate date];
NSDateFormatter* formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"MMMM dd, yyyy";
NSString* dateString = [formatter stringFromDate:date];
Convert a String to a Date:
NSDateFormatter* formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"MMMM dd, yyyy";
NSDate* date = [formatter dateFromString:@"August 02, 2014"];
Find how many days are in a month:
NSDate* date = [NSDate date];
NSCalendar* cal = [NSCalendar currentCalendar];
NSRange currentRange = [cal rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:date];
NSInteger numberOfDays = currentRange.length;
Calculate how much time something took:
NSDate* start = [NSDate date];
for(int i = 0; i < 1000000000; i++);
NSDate* end = [NSDate date];
NSTimeInterval duration = [end timeIntervalSinceDate:start];
Find the Day Of Week for a specific Date:
NSDate* date = [NSDate date];
NSCalendar* cal = [NSCalendar currentCalendar];
NSInteger dow = [cal ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date];
Затем используйте NSComparisonResult для сравнения даты.
Рассматривая ответы, неясно, хотите ли вы буквально сравнить два экземпляра NSDate для равенства (одинаковый момент времени) или хотите знать, находятся ли они в один и тот же день календаря. –