美文网首页
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