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

- (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  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 由于维护老版本的项目中遇到时区错乱的问题,需要更新解决这个问题就需要把系统当地的时区给转化为世界标准时间来处理。注...
    等不来的期待阅读 11,657评论 0 1
  • 在iOS开发中,经常会遇到各种各样的时间问题,8小时时差,时间戳,求时间间隔,农历等等。解决办法网上比比皆是,但大...
    真巧了_嘿阅读 7,806评论 0 7
  • iOS开发中,经常会遇到各种各样的时间问题,8小时时差,时间戳,求时间间隔,农历等等。解决办法网上比比皆是,但大多...
    小李龍彪阅读 11,621评论 1 6
  • 来自心底的声音 文/木语 高温天气里,我的心跌到了谷...
    木语MH阅读 3,229评论 3 4
  • 摆渡人,就是一撑船的。原本就是水里摆渡船的一个人,从河岸的一边,把人送到另一边。 在人生这条长河里,我们时常也会被...
    燕尾无声阅读 2,854评论 0 0

友情链接更多精彩内容