美文网首页
iOS开发 NSDate的一些常用类扩展

iOS开发 NSDate的一些常用类扩展

作者: 我是卖报的小行家 | 来源:发表于2022-04-24 09:28 被阅读0次

我们在开发过程中会在很多地方用到NSDate,系统会提供一些方法供我们去使用,但是也有很多是直接获取不到的,接下来就把一些常用的NSDate的类扩展贴出来

+ (BOOL)is12HourFormat;
+ (NSDateFormatter*)getHourFormat;
- (BOOL)isSameDay:(NSDate *)date;
- (BOOL)isSameWeek:(NSDate *)date;
- (BOOL)isSunday;
- (NSInteger)getDateMonth;
- (NSInteger)getDateDay;
- (NSInteger)getDateHour;
- (NSInteger)getDateMinutes;
- (NSInteger)getBetweenDate:(NSDate *)date;
- (NSInteger)getWeek;
- (NSInteger)getDateYear;
- (NSInteger)getToday;
+ (NSString *)getCurrentDateString;

+(NSInteger )getUnixTime; //使用当前Unix时间

+(NSInteger )getBootTime;  // 获取设备上次重启的unix time

// 记录一下本地时间和服务器时间的差值
+(void)setServerTimestamp:(NSInteger )serverTimestamp;
//返回当前服务器时间
+(NSDate *)nowServer;

//获取具体某个时间点的时间戳
+(NSInteger )getTime: (NSInteger)hour andMinute:(NSInteger)minute andSeconds:(NSInteger)seconds;

/**
  字符串转时间戳 如:2017-4-10 17:15:10
  @param formatTime 时间
  @return 时间戳
*/

+ (NSString *)getOtherTimeStrWithString:(NSString *)formatTime;
//获取某一天的23:59:59点的时间戳
+(NSTimeInterval )getTimeAt24WithDate:(NSDate *)date;
//获取某一天的0点的时间戳
+(NSTimeInterval )getTimeAt00WithDate:(NSDate *)date;
//获取距离当前日期不同天前、后的日期
+(NSDate *)getDate:(NSDate *)currentDate day:(NSInteger)day;

//通过时间戳获得当前日期字符串
+ (NSString *)getDateStringWithTimeseconds:(NSString *)str;
//获取当前时间戳
+ (NSString *)getNowTimestamp;

实现部分

#include <sys/sysctl.h>
#pragma mark 是不是12小时制度
+ (BOOL)is12HourFormat {
    NSString *formatStringForHours = [NSDateFormatter dateFormatFromTemplate:@"j" options:0 locale:[NSLocale currentLocale]];
    NSRange containsA = [formatStringForHours rangeOfString:@"a"];
    BOOL hasAMPM = containsA.location != NSNotFound;
    if (hasAMPM) {
        return YES;
    }
    return NO;
}

- (BOOL)isSameDay:(NSDate *)date{
    NSCalendar* calendar = [NSCalendar currentCalendar];
    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay;
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date];
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:self];
    
    return [comp1 day] == [comp2 day] &&
        [comp1 month] == [comp2 month] &&
        [comp1 year]  == [comp2 year];
}

- (BOOL)isSunday {
    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSInteger week = [[calendar components:NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay | NSCalendarUnitWeekday fromDate:self] weekday];
    if (week == 1) {
        return YES;
    }
    return NO;
}

- (NSInteger)getWeek {
    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSInteger week = [[calendar components:NSCalendarUnitYear | NSCalendarUnitMonth |  NSCalendarUnitDay | NSCalendarUnitWeekday fromDate:self] weekday];
    return week; // 1、周日 2、周一 3、周二 4、周三 5、周四 6、周五、 7、周六
}

- (NSInteger)getDateMonth {
    //  return Calendar.current.component(.hour, from: date)
    return [[NSCalendar currentCalendar] component:NSCalendarUnitMonth fromDate:self];
}

- (NSInteger)getDateDay {
    //  return Calendar.current.component(.hour, from: date)
    return [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:self];
}

- (NSInteger)getDateHour {
    //  return Calendar.current.component(.hour, from: date)
    return [[NSCalendar currentCalendar] component:NSCalendarUnitHour fromDate:self];
}

- (NSInteger)getDateMinutes {
    return [[NSCalendar currentCalendar] component:NSCalendarUnitMinute fromDate:self];
}

- (NSInteger)getDateYear
{
    return [[NSCalendar currentCalendar] component:NSCalendarUnitYear fromDate:self];
}

- (NSInteger)getToday
{
    return [[NSCalendar currentCalendar] component:NSCalendarUnitDay fromDate:self];
}

//NSCurrentLocaleDidChangeNotification 当系统的区域格式,或者时间格式(是否24小时制)改变时
//UIApplicationSignificantTimeChangeNotification 当新的一天来到,或者说当运营商时间更新的时候
#pragma mark 判断是否是同一周
- (BOOL)isSameWeek:(NSDate *)date {
   // 日历对象
   NSCalendar *calendar = [NSCalendar currentCalendar];
   // 一周开始默认为星期天=1。
   calendar.firstWeekday = 1;
   
   unsigned unitFlag = NSCalendarUnitWeekOfYear | NSCalendarUnitYearForWeekOfYear;
   NSDateComponents *comp1 = [calendar components:unitFlag fromDate:date];
   NSDateComponents *comp2 = [calendar components:unitFlag fromDate:self];
   /// 年份和周数相同,即判断为同一周
   /// NSCalendarUnitYearForWeekOfYear已经帮转换不同年份的周所属了,比如2019.12.31是等于2020的。这里不使用year,使用用yearForWeekOfYear
   return (([comp1 yearForWeekOfYear] == [comp2 yearForWeekOfYear]) && ([comp1 weekOfYear] == [comp2 weekOfYear]));
}

#pragma mark 判断两个日期相差多少天
- (NSInteger)getBetweenDate:(NSDate *)date {
    NSDateComponents * comp = [[NSCalendar currentCalendar] components:NSCalendarUnitDay fromDate:date toDate:self options:0];
    return labs(comp.day);
}

+ (NSDateFormatter *)getHourFormat {
    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    if([NSDate is12HourFormat]) {
        [df setDateFormat:@"hh:mm aaa"];
    }else{
        [df setDateFormat:@"HH:mm"];
    }
    return df;
}


+ (NSInteger)getUnixTime
{
    NSTimeInterval time=[[NSDate date] timeIntervalSince1970];
    long long int currentTime = (long long int)time;
    NSString *unixTime = [NSString stringWithFormat:@"%lld000", currentTime];
    return [unixTime integerValue] /1000;
}

+ (NSInteger )getBootTime{ //获取方法,单位是秒

    struct timeval boottime;

    int mib[2] = {CTL_KERN, KERN_BOOTTIME};

    size_t size = sizeof(boottime);

    time_t now;

    (void)time(&now);

    if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1){

        return boottime.tv_sec;

    }

    return 0;
}

+ (void)setServerTimestamp:(NSInteger)serverTimestamp
{
    // 记录当前服务器时间
    NSInteger rumtimes = [NSDate getUnixTime] - [NSDate getBootTime];
    [User_Default setObject:@(serverTimestamp - rumtimes) forKey:@"kServerTimestamp"];
    
}

+ (NSDate *)nowServer
{
    NSInteger serverTime = [[User_Default objectForKey:@"kServerTimestamp"]integerValue];
    if (serverTime == 0) {
        // 服务器时间还没缓存下来,这时候使用本地时间
        return [NSDate date];
    }
    
    NSInteger runtimes = 0;
    runtimes = [NSDate getUnixTime] - [NSDate getBootTime];
    NSInteger currentTime = 0;
    currentTime = serverTime + runtimes;
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:currentTime];
    return date;
}


+ (NSInteger )getTime: (NSInteger)hour andMinute:(NSInteger)minute andSeconds:(NSInteger)seconds{
    NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

    NSTimeZone *timeZone = [[NSTimeZone alloc] init];
    [greCalendar setTimeZone: timeZone];

    NSDateComponents *dateComponents = [greCalendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay  fromDate:[NSDate nowServer]];
    //  定义一个NSDateComponents对象,设置一个时间点
    NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init];
    [dateComponentsForDate setDay:dateComponents.day];
    [dateComponentsForDate setMonth:dateComponents.month];
    [dateComponentsForDate setYear:dateComponents.year];
    [dateComponentsForDate setHour:hour];
    [dateComponentsForDate setMinute:minute];
    [dateComponentsForDate setSecond:seconds];

    NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dateComponentsForDate];
    
    return (long)[dateFromDateComponentsForDate timeIntervalSince1970];
}

+ (NSString *)getOtherTimeStrWithString:(NSString *)formatTime{
    NSLog(@"formatTime - - - - - -%@",formatTime);
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"]; //(@"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] * 1000;
    NSLog(@"将某个时间转化成 时间戳timeSp:%ld",(long)timeSp); //时间戳的值
    return [NSString stringWithFormat:@"%ld",(long)timeSp];
}

+ (NSString *)getCurrentDateString {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    NSDate *datenow = [NSDate date];
    NSString *currentTimeString = [formatter stringFromDate:datenow];
    return currentTimeString;
}

//获取某一天的24点的时间戳
+(NSTimeInterval )getTimeAt24WithDate:(NSDate *)date{
    NSString * formatStr = @"YYYY-MM-dd";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateFormat:formatStr];
    
    NSTimeInterval time = date.timeIntervalSince1970 ;
    NSDate *detaildate = [NSDate dateWithTimeIntervalSince1970:time] ;
    NSString *currentTimeString = [dateFormatter stringFromDate: detaildate];
    NSDate* result = [dateFormatter dateFromString:currentTimeString];
    
    NSTimeInterval timeTenInt = [result timeIntervalSince1970] * 1000 + 86400000 -1;
    return timeTenInt;
}

//获取某一天的23:59:59点的时间戳
+(NSTimeInterval )getTimeAt00WithDate:(NSDate *)date{
    NSString * formatStr = @"YYYY-MM-dd";
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
    [dateFormatter setDateFormat:formatStr];
    
    NSTimeInterval time = date.timeIntervalSince1970;
    NSDate *detaildate = [NSDate dateWithTimeIntervalSince1970:time] ;
    NSString *currentTimeString = [dateFormatter stringFromDate: detaildate];
    NSDate* result = [dateFormatter dateFromString:currentTimeString];
    
    NSTimeInterval timeTenInt = [result timeIntervalSince1970] * 1000;
    return timeTenInt;
}

//获取距离当前日期不同天前、后的日期
+(NSDate *)getDate:(NSDate *)currentDate day:(NSInteger)day {
    NSTimeInterval days = 24 * 60 * 60 * day;  // 一天一共有多少秒
    NSDate *appointDate = [currentDate dateByAddingTimeInterval:days];
    return appointDate;
}

// 时间戳转时间,时间戳为13位是精确到毫秒的,10位精确到秒
+ (NSString *)getDateStringWithTimeseconds:(NSString *)str{
    NSTimeInterval time=[str doubleValue]/1000;//传入的时间戳str如果是精确到毫秒的记得要/1000
    NSDate *detailDate=[NSDate dateWithTimeIntervalSince1970:time];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //实例化一个NSDateFormatter对象
    //设定时间格式,这里可以设置成自己需要的格式
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm ss"];
    NSString *currentDateStr = [dateFormatter stringFromDate: detailDate];
    return currentDateStr;
}

// 时间转时间戳到分
+(NSString *)getNowTimestamp{
    NSDate *currentDate = [NSDate date];
    if ([AppUtil shared].ispayPal) {//如果是睡眠挑战赛则使用服务器时间
        currentDate = [NSDate nowServer];
    }
    NSTimeInterval time=[currentDate timeIntervalSince1970]*1000;
    
    NSString *timeString = [NSString stringWithFormat:@"%.0f", time];
    return timeString;
 
}

相关文章

网友评论

      本文标题:iOS开发 NSDate的一些常用类扩展

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