iOS日期处理

作者: ice_backy | 来源:发表于2016-05-31 13:57 被阅读483次

    服务器返回的时间是字符串,手机获取的时间是NSDate,需要进行转换。

    凡是日期处理,这三个类足够了

    • NSDate
    • NSDateFormatter
    • NSCalendar

    NSDate


    // 获取当前时间(0时区)
    NSDate *now = [NSDate date];
    

    NSDateFormatter


    NSDateFormatter类的作用

    NSString * -> NSDate *
    NSDate * -> NSString *
    

    NSString -> NSDate

    1. 创建日期格式化类
    2. 设置日期格式
    • 如果是欧美时间,设置语言代码
    1. NSString转NSDate

    服务器返回的是普通格式时间

    // 时间字符串
    NSString *string = @"2015-12-10 19:25:07";
    
    // 日期格式化对象
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    
    // 日期格式
    fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    // NSString -> NSDate
    NSDate *date = [fmt dateFromString:string];
    

    服务器返回的是欧美时间

    在iOS中设置欧美日期,需要设置语言区域

    // 时间字符串
    NSString *string = @"Tue May 31 17:46:55 +0800 2011";
    
    // 日期格式化对象
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    
    // 日期格式
    fmt.dateFormat = @"EEE MMM dd HH:mm:SS Z yyyy";
    // 语言代码
    fmt.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    
    // NSString -> NSDate
    NSDate *date = [fmt dateFromString:string];
    ```
    
    ###服务器返回的是时间戳
    - 时间戳:从1970-01-01 00:00:00开始走过的毫秒数
    
    ```objc
    // iOS中接收的参数是秒,需要将时间戳的毫秒转成秒
    [NSDate dateWithTimeIntervalSince1970:string.longLongValue / 1000.0];
    ```
    
    ##NSData -> NSString
    ```objc
    // 日期对象
    NSDate *date = [NSDate date];
    
    // 日期格式化对象
    NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
    
    // 日期格式
    fmt.dateFormat = @"yyyy年MM月dd日 HH:mm:ss";
    
    // NSDate -> NSString
    NSString *string = [fmt stringFromDate:date];
    ```
    不论是NSString转NSDate,还是NSDate转NSString,进行转换时候,都需要`设置格式`。
    
    ##日期比较
    
    ###两个NSDate之间大小比较
    ```objc
    /*
     NSComparisonResult取值
     NSOrderedAscending = -1L, 升序(右>左)
     NSOrderedSame, 相同
     NSOrderedDescending, 降序(右<左)
    */
    NSComparisonResult result = [nowDate compare:createdAtDate];
    
    switch (result) {
        case NSOrderedSame:
            NSLog(@"equal");
            break;
        case NSOrderedAscending:
            NSLog(@"now < createdAt");
            break;
        case NSOrderedDescending:
            NSLog(@"now > createdAt");
            break;
            
        default:
            break;
    }
    ```
    
    ###获取时间间隔差值
    ```objc
    // 手机当前时间和1970年的时间间隔(s)
    NSDate *nowDate = [NSDate date];
    NSTimeInterval interval = [nowDate timeIntervalSince1970];
    
    // 手机当前事件和createdAtDate之间的时间间隔(s)
    NSTimeInterval interval = [nowDate timeIntervalSinceDate:createdAtDate];
    ```
    获取两个时间间隔之后,想要转换成自然语言时间间隔,需要经过计算,考虑到可能会有很多地方要用,抽取成分类
    ```objc
    #import <Foundation/Foundation.h>
    
    // 一次返回多个相关联的值,直接用模型封装
    @interface XYDateItem : NSObject
    @property (nonatomic, assign) NSInteger day;
    @property (nonatomic, assign) NSInteger hour;
    @property (nonatomic, assign) NSInteger minute;
    @property (nonatomic, assign) NSInteger second;
    @end
    
    @interface NSDate (XYExtension)
    - (XYDateItem *)xy_timeIntervalSinceDate:(NSDate *)date;
    @end
    
    
    #import "NSDate+XYExtension.h"
    
    static int const secondPerMinute = 60;
    static int const secondPerHour = 60 * 60;
    static int const secondPerDay = 60 * 60 * 24;
    
    @implementation XYDateItem
    
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"%zd天%zd小时%zd分%zd秒", self.day, self.hour, self.minute, self.second];
    }
    @end
    
    @implementation NSDate (XYExtension)
    
    - (XYDateItem *)xy_timeIntervalSinceDate:(NSDate *)date
    {
        // self和date的时间间隔
        NSTimeInterval interval = [self timeIntervalSinceDate:date];
        // 转成整型
        int intInterval = interval;
        
        XYDateItem *item = [[XYDateItem alloc] init];
        
        item.day = intInterval / secondPerDay;
        item.hour = (intInterval % secondPerDay) / secondPerHour;
        item.minute = ((intInterval % secondPerDay) % secondPerHour) / secondPerMinute;
        item.second = ((intInterval % secondPerDay) % secondPerHour) % secondPerMinute;
        
        return item;
    }
    @end
    ```
    
    #NSCalendar
    ---
    通过NSCalendar类可以获取日期的各种元素
    
    ##获取日期某个元素(iOS8之后)
    ```objc
    - (NSInteger)component:(NSCalendarUnit)unit fromDate:(NSDate *)date
    ```
    ##获取日期元素
    ```objc
    // unit传入什么值,就获取到什么元素,没传入的不获取
    - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;
    ```
    
    ##计算两个NSDate之间的时间间隔
    ```objc
    - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
    ```
    
    ##判断是不是在某一范围
    如判断NSDate数据是不是今天/昨天/明天/周末等等
    - iOS8之后NSCalendar自带方法
    
    ```objc
    // NSCalendar自带方法, iOS8开始
    - (BOOL)isDateInToday:(NSDate *)date
    - (BOOL)isDateInYesterday:(NSDate *)date
    - (BOOL)isDateInTomorrow:(NSDate *)date
    - (BOOL)isDateInWeekend:(NSDate *)date
    ```
    
    - iOS8之前自己写方法
    
    ```objc
    /** 是不是今天 */
    - (BOOL)xy_isToday
    {
        NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
        fmt.dateFormat = @"yyyyMMdd";
        
        NSString *selfString = [fmt stringFromDate:self];
        NSString *nowString = [fmt stringFromDate:[NSDate date]];
    
        return [selfString isEqualToString:nowString];
    }
    
    /** 是不是昨天 */
    - (BOOL)xy_isYesterday
    {
        NSDateFormatter  *fmt = [[NSDateFormatter alloc] init];
        fmt.dateFormat = @"yyyyMMdd";
    
        // 生成只有年月日的字符串
        NSString *selfString = [fmt stringFromDate:self];
        NSString *nowString = [fmt stringFromDate:[NSDate date]];
        
        // 生成只有年月日的日期对象
        NSDate *selfDate = [fmt dateFromString:selfString];
        NSDate *nowDate = [fmt dateFromString:nowString];
        
        NSCalendar *calendar = [NSCalendar xy_calendar];
        NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
        NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
        
        return cmps.year == 0
        && cmps.month == 0
        && cmps.day == 1;
    }
    
    /** 是不是明天 */
    - (BOOL)xy_isTomorrow
    {
        NSDateFormatter  *fmt = [[NSDateFormatter alloc] init];
        fmt.dateFormat = @"yyyyMMdd";
        
        // 生成只有年月日的字符串
        NSString *selfString = [fmt stringFromDate:self];
        NSString *nowString = [fmt stringFromDate:[NSDate date]];
        
        // 生成只有年月日的日期对象
        NSDate *selfDate = [fmt dateFromString:selfString];
        NSDate *nowDate = [fmt dateFromString:nowString];
        
        NSCalendar *calendar = [NSCalendar xy_calendar];
        NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
        NSDateComponents *cmps = [calendar components:unit fromDate:selfDate toDate:nowDate options:0];
        
        return cmps.year == 0
        && cmps.month == 0
        && cmps.day == -1;
    }
    ```
    
    ##NSCalendar使用注意:
    - 使用calendar过程中,currentCalendar方法在iOS8.0以上有时候会崩溃,改用calendarWithIdentifier方法。
    - 但是如果写成calendarWithIdentifier的话,运行在iOS8以下系统会报未找到方法的错误

    相关文章

      网友评论

        本文标题:iOS日期处理

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