可能性のある複製:
2つの日付を比較し、日数を返す方法
2つの日付(「yyyy-mm-dd」の形式の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]);
日付と時刻のプログラミングに関する完全なガイドがあります。ここに 関連セクション があり、これは何をすべきかのヒントを与えてくれます。
他の質問のコード例はここから来ています。
それに基づいて何かを書いてみて、特定の質問がある場合は戻ってきてください。
編集
はい。最も基本的な形式でコードを記述する方法を次に示します。
まず、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
これは非常に大まかなコードです。 2番目の日付が最初の日付より後であることを確認または検証するエラーはありません。
そして、私はこれを次のように使用します(64ビットのGarbage Collected環境で実行します):
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
}
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!
}
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;
}
ObjCコード:
NSDateComponents *dateComponent = [calender components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0];
結果:
int totalDays = (int)dateComponent.day;
スウィフト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!