美文网首页
NSDate+Until 相关日期处理

NSDate+Until 相关日期处理

作者: 架构师的一小步 | 来源:发表于2020-02-06 22:30 被阅读0次
NSDate+Until.h

//
//  NSDate+Until.h
//
//

#import <Foundation/Foundation.h>


typedef NS_ENUM(NSInteger, DateType){
   DateTypeYear=0,
   DateTypeMonth,
   DateTypeDay,
   DateTypeHour,
   DateTypeminute,
   DateTypeSecond
};
/**
 *  常用日期结构:
 yyyy-MM-dd HH:mm:ss.SSS
 yyyy-MM-dd HH:mm:ss
 yyyy-MM-dd
 MM dd yyyy
 */
@interface NSDate (Until)
///获取当前时间
+ (NSString *)until_getTodayDateStrWithDateformatterStr:(NSString *)formatterStr;

///字符串转date
+ (NSDate *)until_getDatefromDateStr:(NSString *)dateStr formatterStr:(NSString *)formatterStr;

///指定日期从字符串转特定格式字符串
+(NSString *)until_getStringfromDateStr:(NSString *)dateStr currentFormat:(NSString*)currentFormat formatterStr:(NSString *)formatterStr;

///获取N天后的日期
+ (NSString *)until_getNewDateFromDate:(NSDate *)date afterDays:(NSInteger)dayNum;

///获取N天前的日期
+ (NSString *)until_getNewDateFromDate:(NSDate *)date beforeDays:(NSInteger)dayNum;

///获取N年后的日期
+ (NSDate *)until_getNewDateFromDate:(NSDate *)date afterYears:(NSInteger)years;

///获取指定日期的第一天和最后一天
+(NSArray *)getMonthFirstAndLastDayWith:(NSString *)dateStr;

///获取指定日期的第一天
+(NSString *)getMonthFirstDayWith:(NSString*)dateStr;

///获取指定日期的最后一天
+(NSString *)getMonthLastDayWith:(NSString*)dateStr;

///比较日期大小
+ (NSComparisonResult)until_compareOneDay:(NSString *)oneDay withAnotherDay:(NSString *)anotherDay;
/**
 获取时间差
 */
+ (NSTimeInterval)util_getResultWithStarTime:(NSString *)starTime endTime:(NSString *)endTime;

+ (NSTimeInterval)util_getResultWithStarTime:(NSString *)starTime endTime:(NSString *)endTime withFormat:(NSString*)format;
/**
 *  获取当前日期是星期几
 **/
+ (NSString *)getweekDayStringWithDate;
/**
 *  获取指定日期是星期几
 **/
+(NSString*)getWeekDayStrignWithDate:(NSString*)date;
/**
 *   根据指定类型获取获取当前日期的年、月、日、时、分、秒
 **/
+(NSString*)GetCurrentDateYearOrMouthOrDay:(DateType)dataType;
/**
 *   根据指定当类型获取指定日期的年、月、日、时、分、秒
 **/
+(NSString*)GetCurrentDateYearOrMouthOrDay:(DateType)dataType withDate:(NSString*)pointDate;
/**
 *   获取当前月份一共有多少天
 **/
+(NSString*)getCurrentDateDays;
/**
 *   获取本周详细日期从星期一到星期日yyyy-MM-dd
 **/
+(NSMutableArray *)backWeeksTimeNumber:(NSInteger)number;

/**
*   获取本周详细日期从星期一到星期日MM/dd
**/
+(NSMutableArray*)GetdateformatterwithArray;
/**
 *   获取本月详细日期从1号到月末yyyy-MM-dd
 **/
+(NSMutableArray*)getCurrentMonthDetailArray;

/**
 *   获取本月详细日期从1号到月末MM/dd
 **/
+(NSMutableArray*)GetdateformatterMonthWithArray;

/**
 *      时间戳转换成时间
 **/
+ (NSString *)getTimeFromTimestamp:(double)tamp withFormat:(NSString*)format;


/**
 *      当前时间转成时间戳
 **/
+ (NSString*)getTimeTampWithCurrentTime;

/**
 *      指定时间转成时间戳
 **/
+ (NSString*)timeSwitchTimestamp:(NSString *)formatTime andFormatter:(NSString *)format;
@end

//
//  NSDate+Until.m
//  Mango_Until
//
//  Created by GN on 2018/6/5.
//  Copyright © 2018年 Mango. All rights reserved.
//

#import "NSDate+Until.h"

@implementation NSDate (Until)

//获取今天日期字符串
+ (NSString *)until_getTodayDateStrWithDateformatterStr:(NSString *)formatterStr{
    
    NSDate *  nowDate=[NSDate date];
    NSDateFormatter  *dateFormatter=[[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:formatterStr];
    NSString *  locationString=[dateFormatter stringFromDate:nowDate];
    
    return locationString;
}

//string转date
+ (NSDate *)until_getDatefromDateStr:(NSString *)dateStr formatterStr:(NSString *)formatterStr{
    NSDateFormatter  *dateFormatter=[[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:formatterStr];
    NSDate *newDate = [dateFormatter dateFromString:dateStr];
    
    return newDate;
}

//指定日期从字符串转特定格式字符串
+(NSString *)until_getStringfromDateStr:(NSString *)dateStr  currentFormat:(NSString*)currentFormat   formatterStr:(NSString *)formatterStr{
    NSDateFormatter  *dateFormatter=[[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:currentFormat];
    NSDate *newDate = [dateFormatter dateFromString:dateStr];
    [dateFormatter setDateFormat:formatterStr];
    NSString *finalDate=[dateFormatter stringFromDate:newDate];
    return finalDate;
}

//获取N天后的日期
+ (NSString *)until_getNewDateFromDate:(NSDate *)date afterDays:(NSInteger)dayNum {
    NSTimeInterval oneDayTime = 24 * 60 * 60 * dayNum;
    
    NSDate *newDate = [date dateByAddingTimeInterval: oneDayTime];
    NSDateFormatter  *dateFormatter=[[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    NSString *  newDateStr = [dateFormatter stringFromDate:newDate];
    
    return newDateStr;
}

//获取N天前的日期
+ (NSString *)until_getNewDateFromDate:(NSDate *)date beforeDays:(NSInteger)dayNum {
    NSTimeInterval oneDayTime = 24 * 60 * 60 * dayNum;
       
       NSDate *newDate = [date dateByAddingTimeInterval:-oneDayTime];
    NSDateFormatter  *dateFormatter=[[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];
    NSString *  newDateStr = [dateFormatter stringFromDate:newDate];
    
    return newDateStr;
}

+ (NSArray *)getMonthFirstAndLastDayWith:(NSString *)dateStr{
    
    NSDateFormatter *format=[[NSDateFormatter alloc] init];
    [format setDateFormat:@"yyyy-MM-dd"];
    NSDate *newDate=[format dateFromString:dateStr];
    double interval = 0;
    NSDate *firstDate = nil;
    NSDate *lastDate = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];

    BOOL OK = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:& firstDate interval:&interval forDate:newDate];
    
    if (OK) {
        lastDate = [firstDate dateByAddingTimeInterval:interval - 1];
    }else {
        return @[@"",@""];
    }

    NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
    [myDateFormatter setDateFormat:@"yyyy-MM-dd"];
    NSString *firstString = [myDateFormatter stringFromDate: firstDate];
    NSString *lastString = [myDateFormatter stringFromDate: lastDate];
    return @[firstString, lastString];
}

+(NSString *)getMonthFirstDayWith:(NSString*)dateStr{
    
    NSDateFormatter *format=[[NSDateFormatter alloc] init];
    [format setDateFormat:@"yyyy-MM-dd"];
    NSDate *newDate=[format dateFromString:dateStr];
    double interval = 0;
    NSDate *firstDate = nil;
    NSDate *lastDate = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];

    BOOL OK = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:& firstDate interval:&interval forDate:newDate];
    
    if (OK) {
        lastDate = [firstDate dateByAddingTimeInterval:interval - 1];
    }else {
        return @"";
    }

    NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
    [myDateFormatter setDateFormat:@"yyyy-MM-dd"];
    NSString *firstString = [myDateFormatter stringFromDate: firstDate];
    
    
    return firstString;
}

+(NSString *)getMonthLastDayWith:(NSString*)dateStr{
    
    NSDateFormatter *format=[[NSDateFormatter alloc] init];
    [format setDateFormat:@"yyyy-MM-dd"];
    NSDate *newDate=[format dateFromString:dateStr];
    double interval = 0;
    NSDate *firstDate = nil;
    NSDate *lastDate = nil;
    NSCalendar *calendar = [NSCalendar currentCalendar];

    BOOL OK = [calendar rangeOfUnit:NSCalendarUnitMonth startDate:& firstDate interval:&interval forDate:newDate];
    
    if (OK) {
        lastDate = [firstDate dateByAddingTimeInterval:interval - 1];
    }else {
        return @"";
    }

    NSDateFormatter *myDateFormatter = [[NSDateFormatter alloc] init];
    [myDateFormatter setDateFormat:@"yyyy-MM-dd"];
//    NSString *firstString = [myDateFormatter stringFromDate: firstDate];
    NSString *lastString = [myDateFormatter stringFromDate: lastDate];
    
    return lastString;
}

//获取N年后的date
+ (NSDate *)until_getNewDateFromDate:(NSDate *)date afterYears:(NSInteger)years {
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setYear:years];//设置最大时间为:当前时间推后十年
    NSDate *newDate = [calendar dateByAddingComponents:comps toDate:date options:0];
    
    return newDate;
}


//比较日期大小
+ (NSComparisonResult)until_compareOneDay:(NSString *)oneDay withAnotherDay:(NSString *)anotherDay {
    NSDate *dateA = [self until_getDatefromDateStr:oneDay formatterStr:@"yyyy-MM-dd"];
    NSDate *dateB = [self until_getDatefromDateStr:anotherDay formatterStr:@"yyyy-MM-dd"];
    NSComparisonResult result = [dateA compare:dateB];
    
    return result;
}



/**
 获取时间差
 */
+ (NSTimeInterval)util_getResultWithStarTime:(NSString *)starTime endTime:(NSString *)endTime {
 return  [NSDate util_getResultWithStarTime:starTime endTime:endTime withFormat:@"yyyy-MM-dd"];
}

+ (NSTimeInterval)util_getResultWithStarTime:(NSString *)starTime endTime:(NSString *)endTime withFormat:(NSString*)format{
    NSDateFormatter* formater = [[NSDateFormatter alloc] init];
    [formater setDateFormat:format];//根据自己的需求定义格式
    NSDate* startDate = [formater dateFromString:starTime];
    NSDate* endDate   = [formater dateFromString:endTime];
    NSTimeInterval time = [endDate timeIntervalSinceDate:startDate];
    return time;
}



+(NSString*)getWeekDayStrignWithDate:(NSString*)date{
    
    
    NSDate *nowDate=[NSDate until_getDatefromDateStr:date formatterStr:@"yyyy-MM-dd"];
    
    NSCalendar * calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; // 指定日历的算法

    NSDateComponents *comps = [calendar components:NSCalendarUnitWeekday fromDate:nowDate];

    // 1 是周日,2是周一 3.以此类推

    NSNumber * weekNumber = @([comps weekday]);

    NSInteger weekInt = [weekNumber integerValue];

    NSString *weekDayString = @"(周一)";
        
    NSString *returnDayString;

    switch (weekInt) {

    case 1:

    {

    weekDayString = @"(周日)";
    returnDayString=@"1";
    }

    break;

    case 2:

    {

    weekDayString = @"(周一)";
    returnDayString=@"2";
    }

    break;

    case 3:

    {

    weekDayString = @"(周二)";
    returnDayString=@"3";
    }

    break;

    case 4:

    {

    weekDayString = @"(周三)";
    returnDayString=@"4";
    }

    break;

    case 5:

    {

    weekDayString = @"(周四)";
    returnDayString=@"5";
    }

    break;

    case 6:

    {

    weekDayString = @"(周五)";
    returnDayString=@"6";
    }

    break;

    case 7:

    {

    weekDayString = @"(周六)";
    returnDayString=@"7";
    }

    break;

    default:

    break;

    }
    DLog(@"===当前日期所对应星期%@",weekDayString);
    return returnDayString;


    
    
    
}
+ (NSString *)getweekDayStringWithDate

{
     NSString *now=[NSDate until_getTodayDateStrWithDateformatterStr:@"yyyy-MM-dd HH-mm-ss"];
     return   [NSDate getWeekDayStrignWithDate:now];
}

//获取当前日期的相关年、月、日、时、分、秒
+(NSString*)GetCurrentDateYearOrMouthOrDay:(DateType)dataType{
      //获取当前时间
    NSString *now=[NSDate until_getTodayDateStrWithDateformatterStr:@"yyyy-MM-dd HH-mm-ss"];
    
    DLog(@"now date is: %@", now);
    return  [NSDate GetCurrentDateYearOrMouthOrDay:dataType withDate:now];
}

//获取指定日期的相关年、月、日、时、分、秒
+(NSString*)GetCurrentDateYearOrMouthOrDay:(DateType)dataType withDate:(NSString*)pointDate{
  
    
    NSDate *now=[NSDate until_getDatefromDateStr:pointDate formatterStr:@"yyyy-MM-dd HH-mm-ss"];//根据需求自己定义格式
    
   //返回值
    NSString*currentString=@"";
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSUInteger unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *dateComponent = [calendar components:unitFlags fromDate:now];

      long year = [dateComponent year];
      long month = [dateComponent month];
      long day = [dateComponent day];
      long hour = [dateComponent hour];
      long minute = [dateComponent minute];
      long second = [dateComponent second];
      switch (dataType) {
        case DateTypeYear:
            currentString=NSStringFormat(@"%ld",year);
            break;
        case DateTypeMonth:
             currentString=NSStringFormat(@"%ld",month);
            break;
            case DateTypeDay:
             currentString=NSStringFormat(@"%ld",day);
            break;
            case DateTypeHour:
             currentString=NSStringFormat(@"%ld",hour);
            break;
            case DateTypeminute:
              if(minute<10){
                  currentString=NSStringFormat(@"0%ld",minute);
              }else{
                  currentString=NSStringFormat(@"%ld",minute);
              }
            break;
            case DateTypeSecond:
             currentString=NSStringFormat(@"%ld",second);
            break;
        default:
           currentString=NSStringFormat(@"%ld",month);
            break;
    }
    return currentString;
}


+ (NSString *)getCurrentDateDays{
    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSRange range = [calendar rangeOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitMonth forDate:[NSDate date]];

    NSUInteger numberOfDaysInMonth = range.length;

    return NSStringFormat(@"%lu",(unsigned long)numberOfDaysInMonth);
}

//ps number 0 为当前周 依次类推
//获取本周详细日期
+(NSMutableArray *)backWeeksTimeNumber:(NSInteger)number
{
    NSDate *date = [[NSDate date] dateByAddingTimeInterval:- 7 * 24 * 3600 * number];
    //滚动后,算出当前日期所在的周(周一-周日)
    NSCalendar *gregorian = [NSCalendar currentCalendar];
    NSDateComponents *comp = [gregorian components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitWeekday fromDate:date];
    NSInteger weekDay = [comp weekday]-1 ;
    // 得到几号
    NSInteger day = [comp day];
    NSLog(@"weekDay:%ld  day:%ld",weekDay,day);
    // 计算当前日期和这周的星期一和星期天差的天数
    long firstDiff,lastDiff;
    if (weekDay == -1)
    {   firstDiff = 1;
        lastDiff = 0;
    }
    else
    {
        firstDiff = [gregorian firstWeekday] - weekDay;
        lastDiff = 7 - weekDay;
    }
    NSMutableArray *currentWeeks = [self getCurrentWeeksWithFirstDiff:firstDiff lastDiff:lastDiff];
    
    return currentWeeks;
}

//获取特定本周格式字符串
+(NSMutableArray*)GetdateformatterwithArray{
    NSMutableArray *arrayFormatter=[NSMutableArray new];
    NSMutableArray *arrayWeek=[NSDate backWeeksTimeNumber:0];
    NSString *strFormat;
    for (strFormat in arrayWeek) {
        NSString *currentFomat=[NSDate until_getStringfromDateStr:strFormat currentFormat:@"yyyy-MM-dd" formatterStr:@"MM/dd"];
        
        [arrayFormatter addObject:currentFomat];
        
    }
    return arrayFormatter;
}

//获取特定本月格式字符串
+(NSMutableArray*)GetdateformatterMonthWithArray{
    NSMutableArray *arrayFormatter=[NSMutableArray new];
    NSMutableArray *arrayMonth=[NSDate getCurrentMonthDetailArray];
    NSString *strFormat;
    for (strFormat in arrayMonth) {
        NSString *currentFomat=[NSDate until_getStringfromDateStr:strFormat currentFormat:@"yyyy-MM-dd" formatterStr:@"MM/dd"];
        
        [arrayFormatter addObject:currentFomat];
        
    }
    return arrayFormatter;
    
}


+(NSMutableArray *)getCurrentWeeksWithFirstDiff:(NSInteger)first lastDiff:(NSInteger)last
{
    NSMutableArray *eightArr = [[NSMutableArray alloc] init];
    for (NSInteger i = first; i < last + 1; i ++)
    {
        //从现在开始的24小时
        NSTimeInterval secondsPerDay = i * 24*60*60;
        NSDate *curDate = [NSDate dateWithTimeIntervalSinceNow:secondsPerDay];
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd"];
        NSString *dateStr = [dateFormatter stringFromDate:curDate];
        [dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"zn_CN"]];
        NSString *strTime = [NSString stringWithFormat:@"%@",dateStr];
        [eightArr addObject:strTime];
    }
    return eightArr;
}

+(NSMutableArray*)getCurrentMonthDetailArray{
    NSMutableArray *dateArray = [[NSMutableArray alloc] init];
    //获取当月第一天
    NSString*firstDay=[self getMonthFirstDayWith:[self until_getTodayDateStrWithDateformatterStr:@"yyyy-MM-dd"]];
    //获取当月一共有多少天
    NSString*getCurrentMonthDays=[self getCurrentDateDays];
    //循环将之后的每一天存储到数组中
    for(NSInteger i=0;i<getCurrentMonthDays.integerValue;i++){
        
    //将第一天的字符串日期转成date
    NSDate *dateFirst=[self until_getDatefromDateStr:firstDay formatterStr:@"yyyy-MM-dd"];
        //获取指定日期之后的一天具体的日期
        NSString *afterDate=[self until_getNewDateFromDate:dateFirst afterDays:i];
        [dateArray addObject:afterDate];
    }
    
    return dateArray;
    
}



+ (NSString *)getTimeFromTimestamp:(double)tamp withFormat:(NSString*)format{

    //将对象类型的时间转换为NSDate类型

//    double time =1504667976;
    
    NSTimeInterval interval = tamp/ 1000.0;
    
    NSDate * myDate=[NSDate dateWithTimeIntervalSince1970:interval];

    //设置时间格式

    NSDateFormatter * formatter=[[NSDateFormatter alloc]init];

    [formatter setDateFormat:format];

    //将时间转换为字符串
    NSString *timeStr=[formatter stringFromDate:myDate];

    return timeStr;

}


+ (NSString *)getTimeTampWithCurrentTime{
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    [formatter setDateStyle:NSDateFormatterMediumStyle];

     [formatter setTimeStyle:NSDateFormatterShortStyle];

    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; // ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制

     //设置时区,这个对于时间的处理有时很重要

    NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];

    [formatter setTimeZone:timeZone];

    NSDate *datenow = [NSDate date];//现在时间



//        NSLog(@"设备当前的时间:%@",[formatter stringFromDate:datenow]);

     //时间转时间戳的方法:
    NSInteger timeSp = [[NSNumber numberWithDouble:[datenow timeIntervalSince1970]] integerValue];

     

//        NSLog(@"设备当前的时间戳:%ld",(long)timeSp); //时间戳的值
    return NSStringFormat(@"%f",(long)timeSp*1000.0);

    


}


+(NSString *)timeSwitchTimestamp:(NSString *)formatTime andFormatter:(NSString *)format{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterMediumStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
[formatter setDateFormat:format]; //(@"YYYY-MM-dd hh:mm:ss") ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制
 NSTimeZone* timeZone = [NSTimeZone timeZoneWithName:@"Asia/Beijing"];
[formatter setTimeZone:timeZone];
NSDate* date = [formatter dateFromString:formatTime]; //------------将字符串按formatter转成nsdate
//时间转时间戳的方法:
NSInteger timeSp = [[NSNumber numberWithDouble:[date timeIntervalSince1970]] integerValue];
//NSLog(@"将某个时间转化成 时间戳&&&&&&&timeSp:%ld",(long)timeSp); //时间戳的值
    NSString *time=NSStringFormat(@"%f",(long)timeSp*1000.0);
return time;
}
@end

相关文章

网友评论

      本文标题:NSDate+Until 相关日期处理

      本文链接:https://www.haomeiwen.com/subject/xdrpxhtx.html