单军华
2018-07-12 3e8437ae559487362fae3525beb79c534c213a51
screendisplay/Pods/EaseUI/EaseUI/EMUIKit/Util/Category/NSDate+Category.m
New file
@@ -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