如题。
画个图分析一下:
代码
- (NSDate *)dateAfterMonths:(NSDate *)currentDate gapMonth:(NSInteger)gapMonthCount {
//获取当年的月份,当月的总天数
NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitCalendar fromDate:currentDate];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setDateFormat:@"yyyy-MM-dd"];
// [formatter setTimeZone:[NSTimeZone localTimeZone]];
// [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]];
NSString *dateStr = @"";
NSInteger endDay = 0;//天
NSDate *newDate = [NSDate date];//新的年&月
//判断是否是下一年
if (components.month+gapMonthCount > 12) {
//是下一年
dateStr = [NSString stringWithFormat:@"%zd-%zd-01",components.year+(components.month+gapMonthCount)/12,(components.month+gapMonthCount)%12];
newDate = [formatter dateFromString:dateStr];
//新月份的天数
NSInteger newDays = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:newDate].length;
if ([self isEndOfTheMonth:currentDate]) {//当前日期处于月末
endDay = newDays;
} else {
endDay = newDays < components.day?newDays:components.day;
}
dateStr = [NSString stringWithFormat:@"%zd-%zd-%zd",components.year+(components.month+gapMonthCount)/12,(components.month+gapMonthCount)%12,endDay];
} else {
//依然是当前年份
dateStr = [NSString stringWithFormat:@"%zd-%zd-01",components.year,components.month+gapMonthCount];
newDate = [formatter dateFromString:dateStr];
//新月份的天数
NSInteger newDays = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:newDate].length;
if ([self isEndOfTheMonth:currentDate]) {//当前日期处于月末
endDay = newDays;
} else {
endDay = newDays < components.day?newDays:components.day;
}
dateStr = [NSString stringWithFormat:@"%zd-%zd-%zd",components.year,components.month+gapMonthCount,endDay];
}
newDate = [formatter dateFromString:dateStr];
return newDate;
}
//判断是否是月末
- (BOOL)isEndOfTheMonth:(NSDate *)date {
NSCalendar *calendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSInteger daysInMonth = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date].length;
NSDateComponents *componets = [calendar components:NSCalendarUnitDay fromDate:date];
if (componets.day >= daysInMonth) {
return YES;
}
return NO;
}
发现个问题,如上方法得到的日期是GMT时间,直接在datePickerView中显示的话是正常的(当然前提是datePickerView本地化),但是打印出来就是GMT时间,设置timezone也无用。