可能是重复问题:
如何比较两个日期,返回相差的天数?
我有两个日期(以字符串形式"yyyy-mm-dd"表示),例如:
NSString *start = "2010-11-01";
NSString *end = "2010-12-01";
我想要实现:
- (int)numberOfDaysBetween:(NSString *)startDate and:(NSString *)endDate {
}
可能是重复问题:
如何比较两个日期,返回相差的天数?
我有两个日期(以字符串形式"yyyy-mm-dd"表示),例如:
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]);
NSDate
组件,看看结果是否偏移了1天,因为某些组件没有超过24小时的差异。 - royherma[components day]
,当比较来自同一时区的两个日期时会收到错误的结果。我会进一步研究它,但非常确定我的做法是正确的。 - royherma有一份完整的日期和时间编程指南。这里是一个相关章节,可以给你提供一些提示。
这是其他问题中示例代码的来源。
试着根据这个写点东西,如果你有具体的问题再回来。
编辑
好的。这是我如何以最基本的形式编写代码。
首先,我会扩展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
这是非常粗糙的代码。没有错误检查或验证第二个日期是否晚于第一个日期。
然后我会像这样使用它(在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);
这真是遗憾,因为如果您发布您的代码和不正确的输出并获得更具体的帮助,您将学到更多。但是如果您只想成为一个复制粘贴程序员,请使用此代码,祝你好运。
NSDate
方法dateWithString
是否存在,但至少很久以前它已被弃用,因此第二个答案更相关,现在必须使用NSDateFormatter
。 - ArtemSwift 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!
}
Objective 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;
}
这段代码在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
}
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!
ObjC代码:
NSDateComponents *dateComponent = [calender components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0];
结果:
int totalDays = (int)dateComponent.day;
NSString *start = @"2010-09-01";
NSString *end = @"2010-09-02";
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd"];
NSDate *startDate = [f dateFromString:start];
NSDate *endDate = [f dateFromString:end];
在这里,两个日期的时间相同,因为它们都没有提供时间,这意味着它不会影响差异计算。
startDate "2010-09-01 12:00 AM"
endDate "2010-09-02 12:00 AM"
结果将会是days = 1
现在让我们为两个日期添加具体时间:
startDate "2010-09-01 02:00 PM"
endDate "2010-09-02 02:00 AM"
@implementation NSCalendar (MySpecialCalculations)
- (NSInteger)daysWithinEraFromDate:(NSDate *)startDate toDate:(NSDate *)endDate {
NSInteger startDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:startDate];
NSInteger endDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:endDate];
return endDay - startDay;
}
@end
更多详细信息可在此处查看
我对这个话题的两分观点,以代表剩下的一半画面。