美文网首页
iOS NSDate详解(时间比较, NSDate和字符串转换)

iOS NSDate详解(时间比较, NSDate和字符串转换)

作者: 浅宇落 | 来源:发表于2019-07-29 16:36 被阅读0次

    时间转为字符串

    NSString *dateStr = [[NSDate date] dateChangeStringWith:@"YYYY-MM-dd HH:mm:ss"];
    // 时间: 2019-07-29 10:35:33
    

    字符串转为时间

    NSDate *date = [NSDate stringChangeDataWithString:@"2018-03-24 09:30:45" stringType:@"YYYY-MM-dd HH:mm:ss"];
     // 时间: 2018-03-24 09:30:45 +0000
    

    时间转为时间戳(单位: 秒)

    NSInteger timeInterval = [[NSDate date] dateChangeTimestamp];
    // 时间: 1564370267
    

    时间戳转为时间

    NSDate *date = [NSDate timestampChangeDateWithTimestamp:1564370267 stringType:@"YYYY-MM-dd HH:mm:ss"];
    // 时间: 2019-07-29 11:17:47 +0000
    

    字符串转为时间戳(单位: 秒)

    NSInteger timeInterval = [NSDate stringChangeTimestampWithString:@"2018-03-24 09:30:45" stringType:@"YYYY-MM-dd HH:mm:ss"];
    // 时间: 1521855045
    

    时间戳转为字符串

    NSString *dateStr = [NSDate timestampChangeStringWithTimestamp:1564370267 stringType:@"YYYY-MM-dd HH:mm:ss"];
    // 时间: 2019-07-29 11:17:47
    

    时间相比较

    NSDate *date = [NSDate stringChangeDataWithString:@"2018-03-29 10:30:45" stringType:@"YYYY-MM-dd HH:mm:ss"];
     CompareType type = [[NSDate date] dateCompareWithDate:date];
    // CompareTypeBig
    

    时间差值

    NSDate *date = [NSDate stringChangeDataWithString:@"2019-07-24 00:00:00" stringType:@"YYYY-MM-dd HH:mm:ss"];
    DateDifference *model = [[NSDate date] dateDifferenceWithDate:date];
    // 时间: 年: 0 月: 0 日: 5  时: 16  分: 16  秒: 45
    

    时区格式转换成字符串

    2019-08-26T09:05:54.000Z 格式转为 yyyy-MM-dd HH:mm:ss 格式

    NSString *dateStr = @"2019-08-26T09:05:54.000Z";
    NSDateFormatter * fmt = [[NSDateFormatter alloc] init];
    fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
    [fmt setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
    NSDate * localeDate = [fmt dateFromString:dateStr];
    NSTimeZone * zone = [NSTimeZone systemTimeZone];
    NSInteger interval = [zone secondsFromGMTForDate:localeDate];
    NSDate * createDate = [localeDate dateByAddingTimeInterval:interval];
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSLog(@"结果: %@", [fmt stringFromDate:createDate]);
    // 结果: 结果: 2019-08-26 17:05:54
    

    封装的类扩展

    NSDate+extension.h

    //
    //  NSDate+extension.h
    //  TimeDemo
    //
    //  Created by yfmac001 on 2019/7/29.
    //  Copyright © 2019 yfmac001. All rights reserved.
    //  时间类扩展
    
    /**
         时间格式:
         G:      公元时代,例如AD公元
         yy:     年的后2位
         yyyy:   完整年
         MM:     月,显示为1-12,带前置0
         MMM:    月,显示为英文月份简写,如 Jan
         MMMM:   月,显示为英文月份全称,如 Janualy
         dd:     日,2位数表示,如02
         d:      日,1-2位显示,如2,无前置0
         EEE:    简写星期几,如Sun
         EEEE:   全写星期几,如Sunday
         aa:     上下午,AM/PM
         H:      时,24小时制,0-23
         HH:     时,24小时制,带前置0
         h:      时,12小时制,无前置0
         hh:     时,12小时制,带前置0
         m:      分,1-2位
         mm:     分,2位,带前置0
         s:      秒,1-2位
         ss:     秒,2位,带前置0
         S:      毫秒
         Z:      GMT(时区)
     */
    
    #import <Foundation/Foundation.h>
    #import "DateDifference.h"
    
    typedef enum : NSInteger {
        CompareTypeBig = 0, // 前者大于后者
        CompareTypeEqual = 1, // 前者等于后者
        CompareTypeSmall = 2, // 前者小于后者
    } CompareType;
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface NSDate (extension)
    /**
     时间转为字符串
    
     @param stringType 转为字符串的类型
     @return 转换后的字符串
     */
    - (NSString *)dateChangeStringWith:(NSString *)stringType;
    
    /**
     字符串转为时间
    
     @param string 要转化的字符串
     @param stringType 转为时间的类型
     @return 转换后的时间
     */
    + (instancetype)stringChangeDataWithString:(NSString *)string stringType:(NSString *)stringType;
    
    /**
     时间转为时间戳(单位: 秒)
    
     @return 转换后的时间戳(单位: 秒)
     */
    - (NSInteger)dateChangeTimestamp;
    
    /**
     时间戳转为时间
    
     @param timestamp 要转化的时间戳
     @param stringType 转为时间的类型
     @return 转换后的时间
     */
    + (instancetype)timestampChangeDateWithTimestamp:(NSInteger)timestamp stringType:(NSString *)stringType;
    
    /**
     字符串转为时间戳(单位: 秒)
    
     @param string 要转化的字符串
     @param stringType 转为时间的类型
     @return 转换后的时间戳(单位: 秒)
     */
    + (NSInteger)stringChangeTimestampWithString:(NSString *)string stringType:(NSString *)stringType;
    
    /**
     时间戳转为字符串
    
     @param timestamp 要转化的时间戳
     @param stringType 转为时间的类型
     @return 转换后的时间
     */
    + (NSString *)timestampChangeStringWithTimestamp:(NSInteger)timestamp stringType:(NSString *)stringType;
    
    /**
     时间相比较
    
     @param date 要比较的时间
     */
    - (CompareType)dateCompareWithDate:(NSDate *)date;
    
    /**
     时间差值
    
     @param date 要比较的时间
     */
    - (DateDifference *)dateDifferenceWithDate:(NSDate *)date;
    @end
    
    NS_ASSUME_NONNULL_END
    
    

    NSDate+extension.m

    //
    //  NSDate+extension.m
    //  TimeDemo
    //
    //  Created by yfmac001 on 2019/7/29.
    //  Copyright © 2019 yfmac001. All rights reserved.
    //
    
    #import "NSDate+extension.h"
    
    
    @implementation NSDate (extension)
    #pragma mark - 时间转为字符串
    - (NSString *)dateChangeStringWith:(NSString *)stringType {
        if (stringType.length <= 0) { // 没值
            NSAssert(NO, @"时间格式不对");
            return @"";
        }
        NSDateFormatter *format = [[NSDateFormatter alloc] init];
        // 设置时区
        [format setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]];
        [format setDateFormat:stringType];
        return [format stringFromDate:self];
    }
    
    #pragma mark - 字符串转为时间
    + (instancetype)stringChangeDataWithString:(NSString *)string stringType:(NSString *)stringType {
        if (stringType.length <= 0 || string.length <= 0) { // 没值
            NSAssert(NO, @"时间格式不对或者时间不对");
            return nil;
        }
        NSDateFormatter *format = [[NSDateFormatter alloc] init];
        [format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:8]];//解决8小时时间差问题
        [format setDateFormat:stringType];
        return [format dateFromString:string];
    }
    
    #pragma mark - 时间转为时间戳(单位: 秒)
    - (NSInteger)dateChangeTimestamp {
        return (NSInteger)[self timeIntervalSince1970];
    }
    
    #pragma mark - 时间戳转为时间
    + (instancetype)timestampChangeDateWithTimestamp:(NSInteger)timestamp stringType:(NSString *)stringType {
        if (timestamp < 0 || stringType.length <= 0) { // 没值
            NSAssert(NO, @"时间格式不对或者时间戳不对");
            return nil;
        }
        NSDate *date = [NSDate dateWithTimeIntervalSince1970:timestamp];
        NSDateFormatter *format = [[NSDateFormatter alloc] init];
        [format setDateFormat:stringType];
        NSString *dateStr = [format stringFromDate:date];
        [format setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:8]];//解决8小时时间差问题
        
        return [format dateFromString:dateStr];
    }
    
    #pragma mark - 字符串转为时间戳(单位: 秒)
    + (NSInteger)stringChangeTimestampWithString:(NSString *)string stringType:(NSString *)stringType {
        if (stringType.length <= 0 || string.length <= 0) { // 没值
            NSAssert(NO, @"时间格式不对或者时间不对");
            return 0;
        }
        NSDateFormatter *format = [[NSDateFormatter alloc] init];
        [format setDateFormat:stringType];
        NSDate *date = [format dateFromString:string];
        return (NSInteger)[date timeIntervalSince1970];
    }
    
    #pragma mark - 时间戳转为字符串
    + (NSString *)timestampChangeStringWithTimestamp:(NSInteger)timestamp stringType:(NSString *)stringType {
        if (timestamp < 0 || stringType.length <= 0) { // 没值
            NSAssert(NO, @"时间格式不对或者时间戳不对");
            return nil;
        }
        NSDate *date = [NSDate dateWithTimeIntervalSince1970:timestamp];
        NSDateFormatter *format = [[NSDateFormatter alloc] init];
        [format setDateFormat:stringType];
        NSString *dateStr = [format stringFromDate:date];
        return dateStr;
    }
    
    #pragma mark - 时间相比较
    - (CompareType)dateCompareWithDate:(NSDate *)date {
       NSComparisonResult result = [self compare:date];
        if (result == NSOrderedAscending) { // 前者小于后者
            return CompareTypeSmall;
        }else if (result == NSOrderedSame) { // 前者等于后者
            return CompareTypeEqual;
        }else { // 前者大于后者
            return CompareTypeBig;
        }
    }
    
    #pragma mark - 时间差值
    - (DateDifference *)dateDifferenceWithDate:(NSDate *)date {
        // 2.创建日历
        NSCalendar *calendar = [NSCalendar currentCalendar];
        calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:8];
        NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
        NSDateComponents *cmps = [calendar components:type fromDate:date toDate:[self dateByAddingTimeInterval:8 * 60 * 60] options:0];
        
        DateDifference *difference = [[DateDifference alloc] init];
        difference.year = cmps.year;
        difference.month = cmps.month;
        difference.day = cmps.day;
        difference.hour = cmps.hour;
        difference.minute = cmps.minute;
        difference.second = cmps.second;
        return difference;
    }
    
    @end
    

    DateDifference.h

    //
    //  DateDifference.h
    //  TimeDemo
    //
    //  Created by yfmac001 on 2019/7/29.
    //  Copyright © 2019 yfmac001. All rights reserved.
    //  时间差 模型
    
    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface DateDifference : NSObject
    /** 年 */
    @property (nonatomic, assign) NSInteger year;
    /** 月 */
    @property (nonatomic, assign) NSInteger month;
    /** 日 */
    @property (nonatomic, assign) NSInteger day;
    /** 时 */
    @property (nonatomic, assign) NSInteger hour;
    /** 分 */
    @property (nonatomic, assign) NSInteger minute;
    /** 秒 */
    @property (nonatomic, assign) NSInteger second;
    @end
    
    NS_ASSUME_NONNULL_END
    
    

    DateDifference.m

    //
    //  DateDifference.m
    //  TimeDemo
    //
    //  Created by yfmac001 on 2019/7/29.
    //  Copyright © 2019 yfmac001. All rights reserved.
    //
    
    #import "DateDifference.h"
    
    @implementation DateDifference
    
    @end
    
    

    相关文章

      网友评论

          本文标题:iOS NSDate详解(时间比较, NSDate和字符串转换)

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