Osheep

时光不回头,当下最重要。

iOS-NSISO8601DateFormatter

前言

  • 1.该类(NSISO8601DateFormatter)是在iOS 10才出现的。
  • 2.该类完美的处理了时间问题,即使你的APP涉及国外用户,那么也不用担心时间出错的问题。

常用方法

  • 1.NSDte转字符串:– stringFromDate:

    使用方法请看 属性介绍 >> 1.timeZone

  • 2.字符串转NSDate:– dateFromString:

    在使用该方法的时候,一定要注意格式问题,目前我见过的格式有:

    第一种:yyyy-MM-dd’T’HH:mm:ssZZZZZ(例如:2017-06-08T12:00:10+08:00)

    第二种:yyyy-MM-dd’T’HH:mm:ss.SZZZZZ(时间带毫秒,例如:2017-06-08T12:00:10.559+08:00,其中.559就是毫秒。)

注意:在处理第二种格式的时候,需要想办法去掉毫秒,否则在使用- dateFromString时,会出问题。心细的朋友会发现,- stringFromDate转出来的字符串中,都是不带毫秒的。

下面笔者给大家介绍下ISO8601时间字符串转NSDate,其实很简单,直接上代码

    NSISO8601DateFormatter *ISO8601DateFormatter = [[NSISO8601DateFormatter alloc] init];

    NSDate *ISO8601Date = [ISO8601DateFormatter dateFromString:@"2017-06-08T12:00:00+08:00"];

    NSLog(@"ISO8601Date = %@", ISO8601Date);

    // 注意:美国芝加哥时间(西5区,比中国慢13小时,比0市区慢5个小时)
    ISO8601Date = [ISO8601DateFormatter dateFromString:@"2017-06-08T12:00:00-05:00"];

    NSLog(@"ISO8601Date = %@", ISO8601Date);

------------打印结果---------------------
ISO8601Date = 2017-06-08 04:00:00 +0000 // 注释:东8区时间转成了0市区的时间了
ISO8601Date = 2017-06-08 17:00:00 +0000 // 注释:西5区时间转成了0市区的时间了

小结:使用- dateFromString方法时,api内部都会将时间统一转成0时区的时间。


属性介绍

  • 1.timeZone
    小结:timeZone设置之后,获取到的时间字符串中会带有时区。另外,目前笔者认为,timeZone值在NSDate转字符串时有作用。
    NSISO8601DateFormatter *ISO8601DateFormatter = [[NSISO8601DateFormatter alloc] init];

    // 格林尼治时间(0时区时间)
    NSDate *GMTDate = [NSDate date];
    // 获取时区名称
    NSLog(@"%@", [NSTimeZone knownTimeZoneNames]);

    // 不设置时区 注意:不设置时区,默认是0时区
    NSString *ISO8601DateString = [ISO8601DateFormatter stringFromDate:GMTDate];
    NSLog(@"ISO8601DateString = %@", ISO8601DateString);

    // 将系统时区设置为当前时区
    ISO8601DateFormatter.timeZone = [NSTimeZone systemTimeZone];
    ISO8601DateString = [ISO8601DateFormatter stringFromDate:GMTDate];
    NSLog(@"ISO8601DateString = %@", ISO8601DateString);

    // 设置美国芝加哥时区 注意:美国芝加哥在西5区,比中国慢13小时
    ISO8601DateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"America/Chicago"];

    ISO8601DateString = [ISO8601DateFormatter stringFromDate:GMTDate];

    NSLog(@"ISO8601DateString = %@", ISO8601DateString);

-----------------------打印结果如下---------------------
ISO8601DateString = 2017-06-09T03:22:48Z // 注释:0时区时间
ISO8601DateString = 2017-06-09T11:22:48+08:00 // 注释:中国时间
ISO8601DateString = 2017-06-08T22:22:48-05:00 // 注释:芝加哥时间

未完待续…

点赞