From 3e8437ae559487362fae3525beb79c534c213a51 Mon Sep 17 00:00:00 2001 From: 单军华 Date: Thu, 12 Jul 2018 13:44:34 +0800 Subject: [PATCH] bug修复和功能优化 --- screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Util/Category/NSDate+Category.m | 515 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 515 insertions(+), 0 deletions(-) diff --git a/screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Util/Category/NSDate+Category.m b/screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Util/Category/NSDate+Category.m new file mode 100755 index 0000000..5cda0d8 --- /dev/null +++ b/screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Util/Category/NSDate+Category.m @@ -0,0 +1,515 @@ +/************************************************************ + * * Hyphenate CONFIDENTIAL + * __________________ + * Copyright (C) 2016 Hyphenate Inc. All rights reserved. + * + * NOTICE: All information contained herein is, and remains + * the property of Hyphenate Inc. + * Dissemination of this information or reproduction of this material + * is strictly forbidden unless prior written permission is obtained + * from Hyphenate Inc. + */ + +#import "NSDate+Category.h" +#import "NSDateFormatter+Category.h" +#import "EaseLocalDefine.h" + +#define DATE_COMPONENTS (NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitWeekOfYear | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday | NSCalendarUnitWeekdayOrdinal) +#define CURRENT_CALENDAR [NSCalendar currentCalendar] + +@implementation NSDate (Category) + +- (NSString *)timeIntervalDescription +{ + NSTimeInterval timeInterval = -[self timeIntervalSinceNow]; + if (timeInterval < 60) { + return NSEaseLocalizedString(@"NSDateCategory.text1", @""); + } else if (timeInterval < 3600) { + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text2", @""), timeInterval / 60]; + } else if (timeInterval < 86400) { + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text3", @""), timeInterval / 3600]; + } else if (timeInterval < 2592000) {//within 30 days + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text4", @""), timeInterval / 86400]; + } else if (timeInterval < 31536000) {//30 days to a year + NSDateFormatter *dateFormatter = [NSDateFormatter dateFormatterWithFormat:NSEaseLocalizedString(@"NSDateCategory.text5", @"")]; + return [dateFormatter stringFromDate:self]; + } else { + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text6", @""), timeInterval / 31536000]; + } +} + +- (NSString *)minuteDescription +{ + NSDateFormatter *dateFormatter = [NSDateFormatter dateFormatterWithFormat:@"yyyy-MM-dd"]; + + NSString *theDay = [dateFormatter stringFromDate:self]; + NSString *currentDay = [dateFormatter stringFromDate:[NSDate date]]; + if ([theDay isEqualToString:currentDay]) { + [dateFormatter setDateFormat:@"ah:mm"]; + return [dateFormatter stringFromDate:self]; + } else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] == 86400) {//one day ago + [dateFormatter setDateFormat:@"ah:mm"]; + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text7", @'"'), [dateFormatter stringFromDate:self]]; + } else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] < 86400 * 7) {//within a week + [dateFormatter setDateFormat:@"EEEE ah:mm"]; + return [dateFormatter stringFromDate:self]; + } else { + [dateFormatter setDateFormat:@"yyyy-MM-dd ah:mm"]; + return [dateFormatter stringFromDate:self]; + } +} + +-(NSString *)formattedTime{ + NSDateFormatter* formatter = [[NSDateFormatter alloc]init]; + [formatter setDateFormat:@"YYYY-MM-dd"]; + NSString * dateNow = [formatter stringFromDate:[NSDate date]]; + NSDateComponents *components = [[NSDateComponents alloc] init]; + [components setDay:[[dateNow substringWithRange:NSMakeRange(8,2)] intValue]]; + [components setMonth:[[dateNow substringWithRange:NSMakeRange(5,2)] intValue]]; + [components setYear:[[dateNow substringWithRange:NSMakeRange(0,4)] intValue]]; + NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDate *date = [gregorian dateFromComponents:components]; + + NSInteger hour = [self hoursAfterDate:date]; + NSDateFormatter *dateFormatter = nil; + NSString *ret = @""; + + //If hasAMPM==TURE, use 12-hour clock, otherwise use 24-hour clock + NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]]; + NSRange containsA = [formatStringForHours rangeOfString:@"a"]; + BOOL hasAMPM = containsA.location != NSNotFound; + + if (!hasAMPM) { //24-hour clock + if (hour <= 24 && hour >= 0) { + dateFormatter = [NSDateFormatter dateFormatterWithFormat:@"HH:mm"]; + }else if (hour < 0 && hour >= -24) { + dateFormatter = [NSDateFormatter dateFormatterWithFormat:NSEaseLocalizedString(@"NSDateCategory.text8", @"")]; + }else { + dateFormatter = [NSDateFormatter dateFormatterWithFormat:@"yyyy-MM-dd HH:mm"]; + } + }else { + if (hour >= 0 && hour <= 6) { + dateFormatter = [NSDateFormatter dateFormatterWithFormat:NSEaseLocalizedString(@"NSDateCategory.text9", @"")]; + }else if (hour > 6 && hour <=11 ) { + dateFormatter = [NSDateFormatter dateFormatterWithFormat:NSEaseLocalizedString(@"NSDateCategory.text10", @"")]; + }else if (hour > 11 && hour <= 17) { + dateFormatter = [NSDateFormatter dateFormatterWithFormat:NSEaseLocalizedString(@"NSDateCategory.text11", @"")]; + }else if (hour > 17 && hour <= 24) { + dateFormatter = [NSDateFormatter dateFormatterWithFormat:NSEaseLocalizedString(@"NSDateCategory.text12", @"")]; + }else if (hour < 0 && hour >= -24){ + dateFormatter = [NSDateFormatter dateFormatterWithFormat:NSEaseLocalizedString(@"NSDateCategory.text13", @"")]; + }else { + dateFormatter = [NSDateFormatter dateFormatterWithFormat:@"yyyy-MM-dd HH:mm"]; + } + } + + ret = [dateFormatter stringFromDate:self]; + return ret; +} + +- (NSString *)formattedDateDescription +{ + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + + [dateFormatter setDateFormat:@"yyyy-MM-dd"]; + NSString *theDay = [dateFormatter stringFromDate:self]; + NSString *currentDay = [dateFormatter stringFromDate:[NSDate date]]; + + NSInteger timeInterval = -[self timeIntervalSinceNow]; + if (timeInterval < 60) { + return NSEaseLocalizedString(@"NSDateCategory.text1", @""); + } else if (timeInterval < 3600) {//within an hour + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text2", @""), timeInterval / 60]; + } else if (timeInterval < 21600) {//within 6 hour + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text3", @""), timeInterval / 3600]; + } else if ([theDay isEqualToString:currentDay]) {//current day + [dateFormatter setDateFormat:@"HH:mm"]; + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text14", @""), [dateFormatter stringFromDate:self]]; + } else if ([[dateFormatter dateFromString:currentDay] timeIntervalSinceDate:[dateFormatter dateFromString:theDay]] == 86400) {//one day ago + [dateFormatter setDateFormat:@"HH:mm"]; + return [NSString stringWithFormat:NSEaseLocalizedString(@"NSDateCategory.text7", @""), [dateFormatter stringFromDate:self]]; + } else { + [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"]; + return [dateFormatter stringFromDate:self]; + } +} + +- (double)timeIntervalSince1970InMilliSecond { + double ret; + ret = [self timeIntervalSince1970] * 1000; + + return ret; +} + ++ (NSDate *)dateWithTimeIntervalInMilliSecondSince1970:(double)timeIntervalInMilliSecond { + NSDate *ret = nil; + double timeInterval = timeIntervalInMilliSecond; + // judge if the argument is in secconds(for former data structure). + if(timeIntervalInMilliSecond > 140000000000) { + timeInterval = timeIntervalInMilliSecond / 1000; + } + ret = [NSDate dateWithTimeIntervalSince1970:timeInterval]; + + return ret; +} + ++ (NSString *)formattedTimeFromTimeInterval:(long long)time{ + return [[NSDate dateWithTimeIntervalInMilliSecondSince1970:time] formattedTime]; +} + +#pragma mark Relative Dates + ++ (NSDate *) dateWithDaysFromNow: (NSInteger) days +{ + // Thanks, Jim Morrison + return [[NSDate date] dateByAddingDays:days]; +} + ++ (NSDate *) dateWithDaysBeforeNow: (NSInteger) days +{ + // Thanks, Jim Morrison + return [[NSDate date] dateBySubtractingDays:days]; +} + ++ (NSDate *) dateTomorrow +{ + return [NSDate dateWithDaysFromNow:1]; +} + ++ (NSDate *) dateYesterday +{ + return [NSDate dateWithDaysBeforeNow:1]; +} + ++ (NSDate *) dateWithHoursFromNow: (NSInteger) dHours +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_HOUR * dHours; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + ++ (NSDate *) dateWithHoursBeforeNow: (NSInteger) dHours +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_HOUR * dHours; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + ++ (NSDate *) dateWithMinutesFromNow: (NSInteger) dMinutes +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_MINUTE * dMinutes; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + ++ (NSDate *) dateWithMinutesBeforeNow: (NSInteger) dMinutes +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_MINUTE * dMinutes; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +#pragma mark Comparing Dates + +- (BOOL) isEqualToDateIgnoringTime: (NSDate *) aDate +{ + NSDateComponents *components1 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + NSDateComponents *components2 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:aDate]; + return ((components1.year == components2.year) && + (components1.month == components2.month) && + (components1.day == components2.day)); +} + +- (BOOL) isToday +{ + return [self isEqualToDateIgnoringTime:[NSDate date]]; +} + +- (BOOL) isTomorrow +{ + return [self isEqualToDateIgnoringTime:[NSDate dateTomorrow]]; +} + +- (BOOL) isYesterday +{ + return [self isEqualToDateIgnoringTime:[NSDate dateYesterday]]; +} + +// This hard codes the assumption that a week is 7 days +- (BOOL) isSameWeekAsDate: (NSDate *) aDate +{ + NSDateComponents *components1 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + NSDateComponents *components2 = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:aDate]; + + // Must be same week. 12/31 and 1/1 will both be week "1" if they are in the same week + if (components1.weekOfYear != components2.weekOfYear) return NO; + + // Must have a time interval under 1 week. Thanks @aclark + return (fabs([self timeIntervalSinceDate:aDate]) < D_WEEK); +} + +- (BOOL) isThisWeek +{ + return [self isSameWeekAsDate:[NSDate date]]; +} + +- (BOOL) isNextWeek +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_WEEK; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return [self isSameWeekAsDate:newDate]; +} + +- (BOOL) isLastWeek +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] - D_WEEK; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return [self isSameWeekAsDate:newDate]; +} + +// Thanks, mspasov +- (BOOL) isSameMonthAsDate: (NSDate *) aDate +{ + NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:self]; + NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear | NSCalendarUnitMonth fromDate:aDate]; + return ((components1.month == components2.month) && + (components1.year == components2.year)); +} + +- (BOOL) isThisMonth +{ + return [self isSameMonthAsDate:[NSDate date]]; +} + +- (BOOL) isSameYearAsDate: (NSDate *) aDate +{ + NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:aDate]; + return (components1.year == components2.year); +} + +- (BOOL) isThisYear +{ + // Thanks, baspellis + return [self isSameYearAsDate:[NSDate date]]; +} + +- (BOOL) isNextYear +{ + NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:[NSDate date]]; + + return (components1.year == (components2.year + 1)); +} + +- (BOOL) isLastYear +{ + NSDateComponents *components1 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:self]; + NSDateComponents *components2 = [CURRENT_CALENDAR components:NSCalendarUnitYear fromDate:[NSDate date]]; + + return (components1.year == (components2.year - 1)); +} + +- (BOOL) isEarlierThanDate: (NSDate *) aDate +{ + return ([self compare:aDate] == NSOrderedAscending); +} + +- (BOOL) isLaterThanDate: (NSDate *) aDate +{ + return ([self compare:aDate] == NSOrderedDescending); +} + +// Thanks, markrickert +- (BOOL) isInFuture +{ + return ([self isLaterThanDate:[NSDate date]]); +} + +// Thanks, markrickert +- (BOOL) isInPast +{ + return ([self isEarlierThanDate:[NSDate date]]); +} + + +#pragma mark Roles +- (BOOL) isTypicallyWeekend +{ + NSDateComponents *components = [CURRENT_CALENDAR components:NSCalendarUnitWeekday fromDate:self]; + if ((components.weekday == 1) || + (components.weekday == 7)) + return YES; + return NO; +} + +- (BOOL) isTypicallyWorkday +{ + return ![self isTypicallyWeekend]; +} + +#pragma mark Adjusting Dates + +- (NSDate *) dateByAddingDays: (NSInteger) dDays +{ + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_DAY * dDays; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +- (NSDate *) dateBySubtractingDays: (NSInteger) dDays +{ + return [self dateByAddingDays: (dDays * -1)]; +} + +- (NSDate *) dateByAddingHours: (NSInteger) dHours +{ + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_HOUR * dHours; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +- (NSDate *) dateBySubtractingHours: (NSInteger) dHours +{ + return [self dateByAddingHours: (dHours * -1)]; +} + +- (NSDate *) dateByAddingMinutes: (NSInteger) dMinutes +{ + NSTimeInterval aTimeInterval = [self timeIntervalSinceReferenceDate] + D_MINUTE * dMinutes; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + return newDate; +} + +- (NSDate *) dateBySubtractingMinutes: (NSInteger) dMinutes +{ + return [self dateByAddingMinutes: (dMinutes * -1)]; +} + +- (NSDate *) dateAtStartOfDay +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + components.hour = 0; + components.minute = 0; + components.second = 0; + return [CURRENT_CALENDAR dateFromComponents:components]; +} + +- (NSDateComponents *) componentsWithOffsetFromDate: (NSDate *) aDate +{ + NSDateComponents *dTime = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:aDate toDate:self options:0]; + return dTime; +} + +#pragma mark Retrieving Intervals + +- (NSInteger) minutesAfterDate: (NSDate *) aDate +{ + NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; + return (NSInteger) (ti / D_MINUTE); +} + +- (NSInteger) minutesBeforeDate: (NSDate *) aDate +{ + NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; + return (NSInteger) (ti / D_MINUTE); +} + +- (NSInteger) hoursAfterDate: (NSDate *) aDate +{ + NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; + return (NSInteger) (ti / D_HOUR); +} + +- (NSInteger) hoursBeforeDate: (NSDate *) aDate +{ + NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; + return (NSInteger) (ti / D_HOUR); +} + +- (NSInteger) daysAfterDate: (NSDate *) aDate +{ + NSTimeInterval ti = [self timeIntervalSinceDate:aDate]; + return (NSInteger) (ti / D_DAY); +} + +- (NSInteger) daysBeforeDate: (NSDate *) aDate +{ + NSTimeInterval ti = [aDate timeIntervalSinceDate:self]; + return (NSInteger) (ti / D_DAY); +} + +// Thanks, dmitrydims +// I have not yet thoroughly tested this +- (NSInteger)distanceInDaysToDate:(NSDate *)anotherDate +{ + NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDateComponents *components = [gregorianCalendar components:NSCalendarUnitDay fromDate:self toDate:anotherDate options:0]; + return components.day; +} + +#pragma mark Decomposing Dates + +- (NSInteger) nearestHour +{ + NSTimeInterval aTimeInterval = [[NSDate date] timeIntervalSinceReferenceDate] + D_MINUTE * 30; + NSDate *newDate = [NSDate dateWithTimeIntervalSinceReferenceDate:aTimeInterval]; + NSDateComponents *components = [CURRENT_CALENDAR components:NSCalendarUnitHour fromDate:newDate]; + return components.hour; +} + +- (NSInteger) hour +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.hour; +} + +- (NSInteger) minute +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.minute; +} + +- (NSInteger) seconds +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.second; +} + +- (NSInteger) day +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.day; +} + +- (NSInteger) month +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.month; +} + +- (NSInteger) week +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.weekOfYear; +} + +- (NSInteger) weekday +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.weekday; +} + +- (NSInteger) nthWeekday // e.g. 2nd Tuesday of the month is 2 +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.weekdayOrdinal; +} + +- (NSInteger) year +{ + NSDateComponents *components = [CURRENT_CALENDAR components:DATE_COMPONENTS fromDate:self]; + return components.year; +} + +@end -- Gitblit v1.8.0