// // Copyright © 2015年 dahua. All rights reserved. // #import "DHDateFormatter.h" #import "NSDate+LeChange.h" #import "NSString+LeChange.h" static const unsigned componentFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfMonth | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal; static NSCalendar *sharedCalendar = nil; @implementation NSDate (LeChange) + (NSCalendar *) lc_currentCalendar { if (!sharedCalendar) { sharedCalendar = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian]; } return sharedCalendar; } + (void)lc_setCurrentCanlendar:(NSCalendarIdentifier)identifier { sharedCalendar = [NSCalendar calendarWithIdentifier:identifier]; } + (NSDate *)lc_dateOfString:(NSString*)dateString withFormat:(NSString *)format { //NSDateFormatter *formatter = [NSDateFormatter new]; DHDateFormatter *formatter = [[DHDateFormatter alloc]initWithGregorianCalendar]; formatter.dateFormat = format; NSDate *date = [formatter dateFromString:dateString]; return date; } - (NSString *)lc_dateDescription { //NSDateFormatter *formatter = [NSDateFormatter new]; DHDateFormatter *formatter = [[DHDateFormatter alloc]initWithGregorianCalendar]; NSDate *todayEndDate = [[NSDate date] lc_dateAtEndOfDay]; NSTimeInterval dayInterval = 3600 * 24; NSTimeInterval dateInterval = [self timeIntervalSince1970]; NSTimeInterval todayEndInterval = [todayEndDate timeIntervalSince1970]; NSTimeInterval todayStartInterval = todayEndInterval - dayInterval + 1; if (dateInterval >= todayStartInterval && dateInterval <= todayEndInterval) { formatter.dateFormat = @"HH:mm"; return [formatter stringFromDate:self]; } else if (dateInterval < todayStartInterval && dateInterval >= todayStartInterval - dayInterval) { formatter.dateFormat = @"HH:mm"; return @"Yesterday"; } formatter.dateFormat = @"yy/MM/dd"; return [formatter stringFromDate:self]; } + (NSDate *)lc_stringToDate:(NSString *)timeString format:(NSString*)format{ //NSDateFormatter *formatter = [NSDateFormatter new]; DHDateFormatter *formatter = [[DHDateFormatter alloc]initWithGregorianCalendar]; formatter.dateFormat = format; NSDate *date = [formatter dateFromString:timeString]; return date; } + (NSString *)lc_stringOfTimeInterval:(NSTimeInterval)timeInterval format:(NSString*)format { NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval]; return [NSDate lc_stringOfDate:date format:format]; } #pragma mark - Time Length + (NSString*)lc_timeByLength:(NSInteger)time { NSInteger hour = time / (60 * 60); NSInteger min = (time % (60 * 60)) / 60; return [NSString stringWithFormat:@"%02ld:%02ld", (long)hour, (long)min]; } #pragma mark - Common Properties - (NSInteger)hour { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; return components.hour; } - (NSInteger)minute { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; return components.minute; } - (NSInteger)seconds { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; return components.second; } - (NSInteger)day { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; return components.day; } - (NSInteger)month { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; return components.month; } - (NSInteger)weekOfYear { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; return components.weekOfYear; } - (NSInteger)weekday { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; return components.weekday; } - (NSInteger)year { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; return components.year; } #pragma mark - Common Days Operation - (NSString *)lc_stringRepresentation { //NSDateFormatter *format = [[NSDateFormatter alloc]init]; DHDateFormatter *format = [[DHDateFormatter alloc]initWithGregorianCalendar]; [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *string = [format stringFromDate:self]; return string; } - (NSString *)lc_stringOfDateWithFormator:(NSString *)formator { //NSDateFormatter *format = [[NSDateFormatter alloc]init]; DHDateFormatter *format = [[DHDateFormatter alloc]initWithGregorianCalendar]; [format setDateFormat:formator]; NSString *string = [format stringFromDate:self]; return string; } - (NSDate *)lc_dateAtStartOfDay { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; components.hour = 0; components.minute = 0; components.second = 0; return [[NSDate lc_currentCalendar] dateFromComponents:components]; } - (NSDate *)lc_dateAtEndOfDay { NSDateComponents *components = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; components.hour = 23; // Thanks Aleksey Kononov components.minute = 59; components.second = 59; return [[NSDate lc_currentCalendar] dateFromComponents:components]; } - (NSDate *)lc_dateBeforeDay { return [self dateByAddingTimeInterval:-SEC_DAY]; } - (NSDate *)lc_dateAfterDay { return [self dateByAddingTimeInterval:SEC_DAY]; } #pragma mark - String Methods - (NSString *)lc_stringDateAtStartOfDay { NSDate *startDate = [self lc_dateAtStartOfDay]; return [startDate lc_stringRepresentation]; } - (NSString *)lc_stringDateAtEndOfDay { NSDate *endDate = [self lc_dateAtEndOfDay]; return [endDate lc_stringRepresentation]; } #pragma mark - Compare Methods - (BOOL)lc_isEqualToDateIgnoringTime:(NSDate *)compareDate { NSDateComponents *components1 = [[NSDate lc_currentCalendar] components:componentFlags fromDate:self]; NSDateComponents *components2 = [[NSDate lc_currentCalendar] components:componentFlags fromDate:compareDate]; return ((components1.year == components2.year) && (components1.month == components2.month) && (components1.day == components2.day)); } - (BOOL)lc_isToday { return [self lc_isEqualToDateIgnoringTime:[NSDate date]]; } - (BOOL)lc_isYesterday { NSCalendar *calendar = [NSDate lc_currentCalendar]; NSDateComponents *components = [calendar components:NSCalendarUnitDay fromDate:self toDate:[NSDate date] options:0]; return components.day == 1; } - (BOOL)isEarlierThanDate:(NSDate *) aDate { return ([self compare:aDate] == NSOrderedAscending); } - (BOOL)isLaterThanDate:(NSDate *) aDate { return ([self compare:aDate] == NSOrderedDescending); } - (BOOL)lc_isInFuture { return ([self isLaterThanDate:[NSDate date]]); } - (BOOL)lc_isInPast { return ([self isEarlierThanDate:[NSDate date]]); } #pragma mark - + (NSString *)lc_currentTimeString; { NSDate *nowdate = [NSDate date]; //NSDateFormatter* format = [[NSDateFormatter alloc] init];//格式化 DHDateFormatter *format = [[DHDateFormatter alloc]initWithGregorianCalendar]; [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString* strCurrentTime = [format stringFromDate:nowdate]; return strCurrentTime; } - (Time_Info)lc_timeInfo { NSCalendar *calendar = [NSCalendar currentCalendar]; NSInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfYear | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; NSDateComponents *comps = [calendar components:unitFlags fromDate:self]; Time_Info timeInfo = {0}; timeInfo.year = (int)[comps year]; timeInfo.month = (int)[comps month]; timeInfo.day = (int)[comps day]; timeInfo.week = (int)[comps weekOfYear]; timeInfo.hour = (int)[comps hour]; timeInfo.minute = (int)[comps minute]; timeInfo.second = (int)[comps second]; return timeInfo; } + (NSDate *)lc_dateFromString:(NSString *)string { if (string == nil) { return nil; } //NSDateFormatter *format = [[NSDateFormatter alloc] init]; DHDateFormatter *format = [[DHDateFormatter alloc]initWithGregorianCalendar]; NSDate *date = nil; //带日期格式: [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; date = [format dateFromString:string]; //不带日期格式的 HH:mm:ss if (date == nil) { [format setDateFormat:@"HH:mm:ss"]; date = [format dateFromString:string]; } //不带日期格式的 HH:mm if (date == nil) { [format setDateFormat:@"HH:mm"]; date = [format dateFromString:string]; } //其他格式的不处理 if (date == nil) { return nil; } return date; } + (NSDate *)lc_todayFromString:(NSString *)string { NSDate *date = [self lc_dateFromString:string]; if (date) { Time_Info currentTime = [[NSDate date] lc_timeInfo]; Time_Info referTime = [date lc_timeInfo]; referTime.year = currentTime.year; referTime.month = currentTime.month; referTime.day = currentTime.day; date = [self lc_dateOfTimeInfo:referTime]; } return date; } + (NSDate *)lc_dateFromString:(NSString *)string format:(NSString *)format { //NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; DHDateFormatter *formatter = [[DHDateFormatter alloc]initWithGregorianCalendar]; [formatter setDateFormat:format]; return [formatter dateFromString:string]; } + (NSString *)lc_stringOfDate:(NSDate *)date format:(NSString *)format { //NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; DHDateFormatter *formatter = [[DHDateFormatter alloc]initWithGregorianCalendar]; [formatter setDateFormat:format]; return [formatter stringFromDate:date]; } + (NSDate *)lc_dateOfTimeInfo:(Time_Info)timeInfo { //NSDateFormatter *format = [[NSDateFormatter alloc]init]; DHDateFormatter *format = [[DHDateFormatter alloc]initWithGregorianCalendar]; [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *strDate = [NSString stringWithFormat:@"%d-%02d-%2d %2d:%2d:%2d", timeInfo.year, timeInfo.month, timeInfo.day, timeInfo.hour, timeInfo.minute, timeInfo.second]; NSDate *date = [format dateFromString:strDate]; return date; } + (NSString *)lc_nextDayStringWithString:(NSString *)string { if (string == nil) { return nil; } NSDate *date = [self lc_dateFromString:string]; NSDate *nextDate = [[NSDate date] dateByAddingTimeInterval:24*3600]; Time_Info nextInfo = [nextDate lc_timeInfo]; Time_Info timeInfo = [date lc_timeInfo]; timeInfo.year = nextInfo.year; timeInfo.month = nextInfo.month; timeInfo.day = nextInfo.day; nextDate = [self lc_dateOfTimeInfo:timeInfo]; NSLog(@"next date:%@", [self lc_stringDate:nextDate]); return [self lc_stringDate:nextDate]; } ///返回yyyy-mm-dd HH:mm:ss的格式 + (NSString *)lc_stringDate:(NSDate *)date { if (date == nil) { return nil; } //NSDateFormatter *format = [[NSDateFormatter alloc]init]; DHDateFormatter *format = [[DHDateFormatter alloc]initWithGregorianCalendar]; [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *string = [format stringFromDate:date]; return string; } ///dateString返回HH:mm格式 + (NSString *)lc_stringDateBeginWithHour:(NSString *)dateString { if (dateString == nil) { return nil; } NSDate *date = [self lc_dateFromString:dateString]; if (date) { //NSDateFormatter *format = [[NSDateFormatter alloc]init]; DHDateFormatter *format = [[DHDateFormatter alloc]initWithGregorianCalendar]; [format setDateFormat:@"HH:mm"]; NSString *string = [format stringFromDate:date]; return string; } return nil; } ///时、分是否晚于当前时间 + (BOOL)lc_isLaterThanCurrentTimeByHour:(int)hour minute:(int)minute { Time_Info currentTime = [[NSDate date] lc_timeInfo]; if (currentTime.hour * 60 * 60 + currentTime.minute * 60 + currentTime.second > hour * 60 * 60 + minute * 60 ) { return NO; } return YES; } @end