美文网首页iOS开发之借鉴专业知识分享(iOS)时间相关
IOS 世界标准时间UTC /GMT 转为当前系统时区对应的时间

IOS 世界标准时间UTC /GMT 转为当前系统时区对应的时间

作者: changeWong | 来源:发表于2017-02-28 12:05 被阅读5293次
    - (NSDate *)getNowDateFromatAnDate:(NSDate *)anyDate {  
        //设置源日期时区  
        NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];//或GMT  
        //设置转换后的目标日期时区  
        NSTimeZone* destinationTimeZone = [NSTimeZone localTimeZone];  
        //得到源日期与世界标准时间的偏移量  
        NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:anyDate];  
        //目标日期与本地时区的偏移量  
        NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:anyDate];  
        //得到时间偏移量的差值  
        NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;  
        //转为现在时间  
        NSDate* destinationDateNow = [[NSDate alloc] initWithTimeInterval:interval sinceDate:anyDate];  
        return destinationDateNow;  
    }  
    

    例子演示:我的机器是北京时区东八区。
    //2013-08-03T12:53:51+0800 UTC时间格式下的北京时间,可以看到北京时间= UTC + 8小时。

    NSDateFormatter *dateFormatter = [[NSDateFormatteralloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
    NSDate *localDate = [dateFormatter dateFromString:@"2013-08-03T04:56:52+0000"];      
    //+0000 表示的是当前时间是个世界时间。
    NSLog(@"now Time = %@",[selfgetNowDateFromatAnDate:localDate]);
    

    结果:
    2013-08-03 12:57:33.391 xxxx[2547:c07] now Time = 2013-08-03 12:56:52 +0000

    以上注意一点,在转出来后带的时间是原参数anydate的时区,因此切不可再用NSDateFormatter 转换。否则会多增加一个时区的时间值。应该使用如下来提取字符串。

    NSString *str = [NSStringstringWithFormat:@"%@", [selfgetNowDateFromatAnDate:localDate]];
        NSLog(@"str = %@",str);
    

    注NSDate对象存放的日期始终是UTC的标准时间,可以根据这个时间进行其它时间的转换。因此上面算出来的时间中时区为 +0000,如果此时再转为字符串。

    //将本地日期字符串转为UTC日期字符串  
    //本地日期格式:2013-08-03 12:53:51  
    //可自行指定输入输出格式  
    - (NSString *)getUTCFormateLocalDate:(NSString *)localDate {  
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];  
        //输入格式  
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSDate *dateFormatted = [dateFormatter dateFromString:localDate];  
        NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];  
        [dateFormatter setTimeZone:timeZone];  
        //输出格式  
        [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];  
        NSString *dateString = [dateFormatter stringFromDate:dateFormatted];
        return dateString;  
    }  
      
    //将UTC日期字符串转为本地时间字符串  
    //输入的UTC日期格式2013-08-03T04:53:51+0000
    - (NSString *)getLocalDateFormateUTCDate:(NSString *)utcDate {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        //输入格式
        [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"];
        NSTimeZone *localTimeZone = [NSTimeZone localTimeZone];
        [dateFormatter setTimeZone:localTimeZone];
        NSDate *dateFormatted = [dateFormatter dateFromString:utcDate];
        //输出格式
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSString *dateString = [dateFormatter stringFromDate:dateFormatted];
        return dateString;
    }  
    
    - (NSString *)getUTCFormatDate:(NSDate *)localDate {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
        [dateFormatter setTimeZone:timeZone];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
        NSString *dateString = [dateFormatter stringFromDate:localDate];
        return dateString;
    }
    
    - (NSDate *)getLocalFromUTC:(NSString *)utc {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        NSTimeZone *timeZone = [NSTimeZone localTimeZone];
        [dateFormatter setTimeZone:timeZone];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
        NSDate *ldate = [dateFormatter dateFromString:utc];
        return ldate;
    }
    
    //以上注意字符串时的输入参数的格式,别外不要用%@来查看NSDate的值,
    //因为本身存的就是UTC ,小心被误倒。将期转换出字符串来查看一下。
    

    下面要说一下iOS-NSDateFormatter格式说明:

    G: 公元时代,例如AD公元  
    yy: 年的后2位  
    yyyy: 完整年  
    MM: 月,显示为1-12  
    MMM: 月,显示为英文月份简写,如 Jan  
    MMMM: 月,显示为英文月份全称,如 Janualy  
    dd: 日,2位数表示,如02  
    d: 日,1-2位显示,如 2  
    EEE: 简写星期几,如Sun  
    EEEE: 全写星期几,如Sunday  
    aa: 上下午,AM/PM  
    H: 时,24小时制,0-23  
    K:时,12小时制,0-11  
    m: 分,1-2位  
    mm: 分,2位  
    s: 秒,1-2位  
    ss: 秒,2位  
    S: 毫秒  
    Z:GMT  
    

    常用的时间格式有:

    yyyy-MM-dd HH:mm:ss.SSS  
    yyyy-MM-dd HH:mm:ss  
    yyyy-MM-dd  
    MM dd yyyy  
    

    相关文章

      网友评论

      • 出门右转掘金见:建议注明出处
      • 5831487e4a23:我在CSDN看到过原文,你如果不是原作者,请注明出处,如果是抄袭,这种行为,让人作呕。
        changeWong:我没有说全是我自己写的,这是我在解决问题时整理的笔记,有雷同文章但是我也有加入自己其他更详细的资料或者数据,而且我也没有强行让你看,你觉得作呕可以不看。谢谢!
      • 我叫山鸡_:抄袭的吧

      本文标题:IOS 世界标准时间UTC /GMT 转为当前系统时区对应的时间

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