// // NSDate+Extension.m // YZCCalender // // Created by Jason on 2018/1/17. // Copyright © 2018年 jason. All rights reserved. // #import "NSDate+Extension.h" @implementation NSDate (Extension) #pragma mark -- 获取日 + (NSInteger)day:(NSString *)date { NSDateFormatter *dateFormatter = [[self class] setDataFormatter]; NSDate *startDate = [dateFormatter dateFromString:date]; NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:startDate]; return components.day; } #pragma mark -- 获取月 + (NSInteger)month:(NSString *)date { NSDateFormatter *dateFormatter = [[self class] setDataFormatter]; NSDate *startDate = [dateFormatter dateFromString:date]; NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:startDate]; return components.month; } #pragma mark -- 获取年 + (NSInteger)year:(NSString *)date { NSDateFormatter *dateFormatter = [[self class] setDataFormatter]; NSDate *startDate = [dateFormatter dateFromString:date]; NSDateComponents *components = [[NSCalendar currentCalendar] components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:startDate]; return components.year; } #pragma mark -- 获得当前月份第一天星期几 + (NSInteger)firstWeekdayInThisMonth:(NSDate *)date { NSCalendar *calendar = [NSCalendar currentCalendar]; //设置每周的第一天从周几开始,默认为1,从周日开始 [calendar setFirstWeekday:1];//1.Sun. 2.Mon. 3.Thes. 4.Wed. 5.Thur. 6.Fri. 7.Sat. NSDateComponents *comp = [calendar components:(NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:date]; [comp setDay:1]; NSDate *firstDayOfMonthDate = [calendar dateFromComponents:comp]; NSUInteger firstWeekday = [calendar ordinalityOfUnit:NSCalendarUnitWeekday inUnit:NSCalendarUnitWeekOfMonth forDate:firstDayOfMonthDate]; //若设置从周日开始算起则需要减一,若从周一开始算起则不需要减 return firstWeekday - 1; } #pragma mark -- 获取当前月共有多少天 + (NSInteger)totaldaysInMonth:(NSDate *)date { NSRange daysInLastMonth = [[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:date]; return daysInLastMonth.length; } #pragma mark -- 获取日期 + (NSString *)timeStringWithInterval:(NSTimeInterval)timeInterval { NSDateFormatter *dateFormatter = [[self class] setDataFormatter]; NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval]; NSString *dateString = [dateFormatter stringFromDate:date]; return dateString; } #pragma mark -- 设置日期格式 + (NSDateFormatter *)setDataFormatter { NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd"]; [dateFormatter setLocale:[NSLocale currentLocale]]; return dateFormatter; } #pragma mark -- 计算两个日期之间相差天数 + (NSDateComponents *)calcDaysbetweenDate:(NSString *)startDateStr endDateStr:(NSString *)endDateStr { NSDateFormatter *dateFormatter = [[self class] setDataFormatter]; NSDate *startDate = [dateFormatter dateFromString:startDateStr]; NSDate *endDate = [dateFormatter dateFromString:endDateStr]; //利用NSCalendar比较日期的差异 NSCalendar *calendar = [NSCalendar currentCalendar]; /** * 要比较的时间单位,常用如下,可以同时传: * NSCalendarUnitDay : 天 * NSCalendarUnitYear : 年 * NSCalendarUnitMonth : 月 * NSCalendarUnitHour : 时 * NSCalendarUnitMinute : 分 * NSCalendarUnitSecond : 秒 */ NSCalendarUnit unit = NSCalendarUnitDay | NSCalendarUnitMonth; NSDateComponents *delta = [calendar components:unit fromDate:startDate toDate:endDate options:0]; return delta; } + (NSTimeInterval)timeIntervalFromDateString:(NSString *)dateString { static NSDateFormatter *dateFormatter = nil; if (dateFormatter == nil) { dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; [dateFormatter setLocale:[NSLocale currentLocale]]; } NSDate *date = [dateFormatter dateFromString:dateString]; NSTimeInterval interval = [date timeIntervalSince1970]; return interval; } + (BOOL)isToday:(NSString *)date { BOOL isToday = NO; NSString *today = [NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970]; if ([date isEqualToString:today]) { isToday = YES; } return isToday; } + (BOOL)isEqualBetweenWithDate:(NSString *)date toDate:(NSString *)toDate { BOOL isToday = NO; if ([toDate isEqualToString:date]) { isToday = YES; } return isToday; } + (BOOL)isCurrenMonth:(NSString *)date { BOOL isCurrenMonth = NO; NSString *month = [[NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970] substringWithRange:NSMakeRange(0, 7)]; if ([date isEqualToString:month]) { isCurrenMonth = YES; } return isCurrenMonth; } + (BOOL)isCurrenYear:(NSString *)date{ BOOL isCurrenYear = NO; NSString *year = [[NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970] substringWithRange:NSMakeRange(0, 4)]; if ([date isEqualToString:year]) { isCurrenYear = YES; } return isCurrenYear; } + (NSString *)getTimeWihtDate:(NSString *)date { // NSLog(@"日:%@",[date substringWithRange:NSMakeRange(11, 5)]); // NSLog(@"月:%@",[date substringWithRange:NSMakeRange(5, 5)]); // NSLog(@"年:%@",[date substringWithRange:NSMakeRange(0, 10)]); // date = @"2017-11-10 09:11:11"; if ([[date substringWithRange:NSMakeRange(0, 10)] isEqualToString:[NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970]]) { return [date substringWithRange:NSMakeRange(11, 5)]; }else if([[date substringWithRange:NSMakeRange(0, 7)] isEqualToString:[[NSDate timeStringWithInterval:[NSDate date].timeIntervalSince1970] substringWithRange:NSMakeRange(0, 7)]]){ return [date substringWithRange:NSMakeRange(5, 5)]; }else{ return [date substringWithRange:NSMakeRange(0, 10)]; } } + (NSString *)getTimeStringAutoShort2:(NSString *)date{ if ([date isKindOfClass:[NSNull class]] || date == nil) { return @""; }else{ if (date.length == 0) { return @""; } } NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"]; NSString * ret = nil; NSCalendar * calendar = [NSCalendar currentCalendar]; // 当前时间 NSDate * currentDate = [NSDate date]; NSDateComponents * curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:currentDate]; NSInteger currentYear = [curComponents year]; NSInteger currentMonth = [curComponents month]; NSInteger currentDay = [curComponents day]; // 目标判断时间 NSDateComponents*srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:dt]; NSInteger srcYear = [srcComponents year]; NSInteger srcMonth = [srcComponents month]; NSInteger srcDay = [srcComponents day]; // 要额外显示的时间分钟 if(currentYear == srcYear) { long currentTimestamp = [self getIOSTimeStamp:currentDate]; long srcTimestamp = [self getIOSTimeStamp:dt]; // 相差时间(单位:秒) long delta = currentTimestamp - srcTimestamp; // 当天(月份和日期一致才是) if(currentMonth == srcMonth && currentDay == srcDay) { // 时间相差60秒以内 if(delta < 60){ ret = @"刚刚"; }else if (delta < 60 * 60){ ret = [NSString stringWithFormat:@"%ld分钟前",(long)delta/60]; }else{ ret = [NSString stringWithFormat:@"%ld小时前",(long)delta/60/60]; } }else{ ret = [self getTimeString:dt format:@"MM-dd HH:mm"]; } }else{/// 往年 2020-12-21 ret = [self getTimeString:dt format:@"yyyy-MM-dd"]; } return ret; } + (NSString *)getTimeStringAutoShort3:(NSString *)date{ if ([date isKindOfClass:[NSNull class]] || date == nil) { return @""; }else{ if (date.length == 0) { return @""; } } NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"]; NSString * ret = [self getTimeString:dt format:@"yyyy-MM-dd"]; return ret; } + (NSString *)getTimeString:(NSDate *)dt format:(NSString *)fmt{ NSDateFormatter* format = [[NSDateFormatter alloc] init]; [format setDateFormat:fmt]; return [format stringFromDate:[NSDate dateWithTimeIntervalSince1970:[dt timeIntervalSince1970]]]; } + (NSDate *)getStringDate:(NSString *)date format:(NSString *)fmt{ NSDateFormatter* format = [[NSDateFormatter alloc] init]; [format setDateFormat:fmt]; return [format dateFromString:date]; } + (long)getIOSTimeStamp:(NSDate*)dat{ long a = [dat timeIntervalSince1970]; return a; } + (long)getIOSTimeStamp_l:(NSDate*)dat{ return[[NSNumber numberWithDouble:[self getIOSTimeStamp:dat]] longValue]; } + (NSString *)getCHtimeWihtDate:(NSString *)date { NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"]; NSString * ret = nil; NSCalendar * calendar = [NSCalendar currentCalendar]; // 当前时间 NSDate * currentDate = [NSDate date]; NSDateComponents * curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:currentDate]; NSInteger currentYear = [curComponents year]; // 目标判断时间 NSDateComponents*srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:dt]; NSInteger srcYear = [srcComponents year]; // 要额外显示的时间分钟 // 当年 if(currentYear == srcYear) { ret = [self getTimeString:dt format:@"MM-dd HH:mm"]; }else{/// 往年 2020-12-21 ret = [self getTimeString:dt format:@"yyyy-MM-dd HH:mm"]; } return ret; } + (NSString *)getDayWihtDate:(NSString *)date { NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"]; NSString * ret = [self getTimeString:dt format:@"MM-dd"]; return ret; } + (NSString *)getMonthAndDayWihtDate:(NSString *)date { NSDate * dt = [self getStringDate:date format:@"yyyy-MM-dd HH:mm:ss"]; NSString * ret = nil; NSCalendar * calendar = [NSCalendar currentCalendar]; // 当前时间 NSDate * currentDate = [NSDate date]; NSDateComponents * curComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:currentDate]; NSInteger currentYear = [curComponents year]; NSInteger currentMonth = [curComponents month]; NSInteger currentDay = [curComponents day]; // 目标判断时间 NSDateComponents*srcComponents = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:dt]; NSInteger srcYear = [srcComponents year]; NSInteger srcMonth = [srcComponents month]; NSInteger srcDay = [srcComponents day]; // 要额外显示的时间分钟 if(currentYear == srcYear) { long currentTimestamp = [self getIOSTimeStamp:currentDate]; long srcTimestamp = [self getIOSTimeStamp:dt]; // 相差时间(单位:秒) long delta = currentTimestamp - srcTimestamp; // 当天(月份和日期一致才是) if(currentMonth == srcMonth && currentDay == srcDay) { // 时间相差60秒以内 ret = @"今天"; }else if(delta > 60 * 60 * 24 && delta < 60 * 60 * 48) { ret = @"昨天"; }else{ ret = [self getTimeString:dt format:@"MM-dd"]; } }else{/// 往年 2020-12-21 ret = [self getTimeString:dt format:@"MM-dd"]; } return ret; } @end