目标C - 计算两个日期之间的天数

时间:2011-01-01 20:42:45

标签: objective-c ios nsstring nsdate

  

可能重复:
  How can I compare two dates, return a number of days.

我有两个日期(例如“yyyy-mm-dd”形式的NSString),例如:

NSString *start = "2010-11-01";
NSString *end = "2010-12-01";

我想实施:

- (int)numberOfDaysBetween:(NSString *)startDate and:(NSString *)endDate {

}

谢谢!

7 个答案:

答案 0 :(得分:169)

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]);

答案 1 :(得分:23)

日期和时间编程有一整套指南。这是relevant section,它为您提供了有关如何做的提示。

这是示例代码来自另一个问题的地方。

尝试并根据该内容写一些内容,如果您有特定问题,请回来。

修改

好。以下是我将以最基本的形式编写代码的方法。

首先,我会扩展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);

这真是太遗憾了,因为通过发布代码和不正确的输出以及获得更具体的帮助,您将学到更多东西。但如果你只是想成为一名剪切粘贴的程序员;拿这个代码,祝你好运。

答案 2 :(得分:6)

这段代码似乎在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
}

答案 3 :(得分:4)

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;

}

答案 4 :(得分:3)

ObjC代码:

NSDateComponents *dateComponent = [calender components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0];

结果:

int totalDays = (int)dateComponent.day;

答案 5 :(得分:3)

斯威夫特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!

答案 6 :(得分:1)

上述示例仅代表解决方案的一半,因为大多数解决方案在计算差异时仅考虑日期值(例如:2010-11-01),但在现实世界中场景 NSDate 实例总是和时间在一起,也会影响结果的差异。

现在,让我们谈谈用户定义两个日期而不是时间的公认解决方案。

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"

添加特定时间后,结果会发生变化。现在 days = 0 即使日期中定义的日期不同。 这是因为两个日期之间的时差小于 24 小时。

只要满足以下条件,这种计算方法就可以正常工作:

  • 所需结果取决于时差。

  • 时间没有区别。

但是,如果您想根据日历日期更改计算天数差异,那么就会出现问题,因为在上面的示例中,即使日历日期更改了,但结果会天 = 0。因为时差不到24小时。

那么,我们如何计算基于日历日期变化的天数差异。这是 Apple 建议的做法:

@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 

可提供更多详细信息here

我在这个主题上的两分钱代表了图片的剩余一半。