目标C-计算两个date之间的天数
可能重复:
我怎样才能比较两个date,返回一个天数。
我有两个date(如“yyyy-mm-dd”forms的NSString),例如:
NSString *start = "2010-11-01"; NSString *end = "2010-12-01";
我想实现:
- (int)numberOfDaysBetween:(NSString *)startDate and:(NSString *)endDate { }
谢谢!
NSString *start = @"2010-09-01"; NSString *end = @"2010-12-01"; NSDateFormatter *f = [[NSDateFormatter alloc] init]; [f setDateFormat:@"yyyy-MM-dd"]; NSDate *startDate = [f dateFromString:start]; NSDate *endDate = [f dateFromString:end]; NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDateComponents *components = [gregorianCalendar components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0];
components
现在保持不同。
NSLog(@"%ld", [components day]);
有一个完整的date和时间编程指南。 这里有一个相关的部分给你一个关于怎么做的提示。
这是示例代码来自另一个问题的地方。
尝试和写一些基于这个,然后回来,如果你有具体的问题。
编辑
好的。 这里是我将如何写它的最基本的forms的代码。
首先,我会扩展NSDate。
头文件:
// NSDate+ADNExtensions.h #import <Cocoa/Cocoa.h> @interface NSDate (ADNExtensions) - (NSInteger)numberOfDaysUntil:(NSDate *)aDate; @end
执行文件:
// NSDate+ADNExtensions.m #import "NSDate+ADNExtensions.h" @implementation NSDate (ADNExtensions) - (NSInteger)numberOfDaysUntil:(NSDate *)aDate { NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit fromDate:self toDate:aDate options:0]; return [components day]; } @end
这是非常粗糙的代码。 没有错误检查或validation第二个date晚于第一个。
然后我会像这样使用它(运行在64位垃圾收集环境中):
NSDate *startDate = [NSDate dateWithString:@"2010-11-01 00:00:00 +0000"]; NSDate *endDate = [NSDate dateWithString:@"2010-11-02 00:00:00 +0000"]; NSInteger difference = [startDate numberOfDaysUntil:endDate]; NSLog(@"Diff = %ld", difference);
这真是太遗憾了,因为通过发布你的代码和错误的输出结果并获得更多的具体帮助,你将会学到更多东西。 但是,如果你只是想成为一个剪贴式程序员, 把这个代码和祝你好运。
这个代码似乎在Swift 2中很好地工作:
func daysBetweenDate(startDate: NSDate, endDate: NSDate) -> Int { let calendar = NSCalendar.currentCalendar() let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: []) return components.day }
ObjC代码:
NSDateComponents *dateComponent = [calender components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0];
结果:
int totalDays = (int)dateComponent.day;
Swift 3:
let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd" let start = formatter.date(from: "2010-09-01")! let end = formatter.date(from: "2010-12-01")! let days = Calendar.current.dateComponents([.day], from: start, to: end).day!
Swift 4的实现
方法调用:
let numberOfDays = daysBetweenDates(startDate: fileCreatedDate,endDate: date)
方法实施:
func daysBetweenDates(startDate: Date, endDate: Date) -> Int { let daysBetween = Calendar.current.dateComponents([.day], from: startDate, to: endDate) print(daysBetween.day!) return daysBetween.day! }
目标C的实施:
方法调用:
int numberOfDaysSinceFileCreation = [self daysBetweenDates: fileCreatedDate currentDate: today];
方法实施:
- (int) daysBetweenDates: (NSDate *)startDate currentDate: (NSDate *)endDate { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *dateComponent = [calendar components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0]; int totalDays = (int)dateComponent.day; return totalDays; }