思考の軌跡 試行の足跡

iOSアプリのコーディングメモやデザインについて、マーケティング、読んだ書籍、気になるニュースに関して書き綴るブログです。

【Xcode,iOS,Obective-C】今月の末日、翌月の初日、今月の日数を求めるロジックメモ

あまり参考になる記事がググっても見つからず、自分流のロジックを作ったのでメモ。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //今日の日付を取得
    NSDate *nowdate = [NSDate date];
    
    //フォーマッターを準備
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
    [formatter setDateFormat:@"yyyyMMdd"];
    
    //西暦と月のデータをNSStringで生成
    NSString *today = [formatter stringFromDate:nowdate];
    NSString *thisMonth = [today substringWithRange:NSMakeRange(0,6)];
    
    //西暦と月のNSStringを一度数字にして+1して翌月を求め"01"を追加し翌月の初日を生成する
    //ただし、12月の場合は89を足して翌年1月を生成する
    NSString *nextMonthFirstDay = nil;
    if ([[thisMonth substringWithRange:NSMakeRange(4, 2)]  isEqual: @"12"]) {
        
      nextMonthFirstDay = [NSString stringWithFormat:@"%d", [thisMonth intValue] +89];
    } else {
      nextMonthFirstDay = [NSString stringWithFormat:@"%d", [thisMonth intValue] +1];
    }
    nextMonthFirstDay = [NSString stringWithFormat:@"%@%@", nextMonthFirstDay, @"01"];

    //1日戻すためNSDateに変換
    //翌月の初日を算出したい場合はここでゲット!
    NSDate* formatterDate = [formatter dateFromString:nextMonthFirstDay];
    
    // 1日前へ戻す(-86400秒)
    //addTimeIntervalはiOS4までだと警告が出るので、dateByAddingTimeIntervalを使う事
    //ここで今月の末日を算出したい場合はここでゲット!
    formatterDate = [formatterDate dateByAddingTimeInterval: -1 *24 *60 *60];
    
    //今月の総日数を算出したい場合はここでゲット!
    NSString *thisMonthLastDay = [formatter stringFromDate:formatterDate];
    thisMonthLastDay = [thisMonthLastDay substringWithRange:NSMakeRange(6, 2)];
}