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

Cod*_*Guy 56 objective-c nsdate nsstring ios

可能重复:
如何比较两个日期,返回天数.

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

NSString *start = "2010-11-01";
NSString *end = "2010-12-01";
Run Code Online (Sandbox Code Playgroud)

我想实施:

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

}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Vik*_*ica 171

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];
Run Code Online (Sandbox Code Playgroud)

components 现在有所不同.

NSLog(@"%ld", [components day]);
Run Code Online (Sandbox Code Playgroud)


Abi*_*ern 23

日期和时间编程有一个完整的指南.这是一个相关部分,为您提供有关如何做的提示.

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

尝试并根据它写一些东西,如果你有特定的问题,请回来.

编辑

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

首先,我会扩展NSDate.

头文件:

//  NSDate+ADNExtensions.h

#import <Cocoa/Cocoa.h>


@interface NSDate (ADNExtensions)

- (NSInteger)numberOfDaysUntil:(NSDate *)aDate;

@end
Run Code Online (Sandbox Code Playgroud)

实施文件:

//  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
Run Code Online (Sandbox Code Playgroud)

这是非常粗略的代码.没有错误检查或验证第二个日期晚于第一个日期.

然后我会像这样使用它(在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);
Run Code Online (Sandbox Code Playgroud)

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

  • 罗伯特,这不是一个"给我代码"的网站.问一个关于你坚持的事情的问题,你会得到*帮助*来解决这个问题.人们不仅要为你解决问题.您越早理解这一点,您就可以越早获得Stack Overflow上的人们更好的答案.我认为Abizer在给你代码方面有点*太棒了.;) (13认同)
  • 嘿,我进来找了这样的代码片段,现在我正在做一个很大的内疚之旅,哈哈! (4认同)

iph*_*aaw 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
}
Run Code Online (Sandbox Code Playgroud)


Nai*_*hta 5

Swift 4实施

方法调用:

let numberOfDays = daysBetweenDates(startDate: fileCreatedDate,endDate: date)
Run Code Online (Sandbox Code Playgroud)

方法实现:

 func daysBetweenDates(startDate: Date, endDate: Date) -> Int {
        let daysBetween = Calendar.current.dateComponents([.day], from: startDate, to: endDate)
        print(daysBetween.day!)
        return daysBetween.day!
  }
Run Code Online (Sandbox Code Playgroud)

目标C的实现:

方法调用:

int numberOfDaysSinceFileCreation = [self daysBetweenDates: fileCreatedDate
                                                                   currentDate: today];
Run Code Online (Sandbox Code Playgroud)

方法实现:

- (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;

}
Run Code Online (Sandbox Code Playgroud)