iOS学习 --- 时区设置NSTimeZone

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiaxin_1105/article/details/81222861

最近在考虑获取当前时间的问题,因为我们的App不一定只是在中国境内使用,当他们查看App的时候,如果App内有涉及到获取当前时间,那么要注意了!!!

目前从iOS7开始,系统获取的时间是以时区为准,而不是以地区为准,那么在你手机里设置, 通用-->日期与时间 你会看到如下界面.

这里默认的是自动设置,应该就是系统获取了你当前的坐标,判断你的坐标在中国境内,所以时区自动设置为北京.

然而,当你去了英国伦敦游玩呢?系统会获取你的坐标(前提是上图中时区你开启了自动设置),定位为伦敦,那么你的时间就会设置为英国伦敦当地正确的当前时间.

当然,你获取到了当地的正确时间,但是当你打开App时,如果你是按照下面的方法获取的当前时间,也没有问题.



-(NSString*)getCurrentTimes{
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // ----------设置你想要的格式,hh与HH的区别:分别表示12小时制,24小时制
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    //现在时间,你可以输出来看下是什么格式
    NSDate *datenow = [NSDate date];
    //----------将nsdate按formatter格式转成nsstring
    NSString *currentTimeString = [formatter stringFromDate:datenow];
    NSLog(@"currentTimeString =  %@",currentTimeString);
    return currentTimeString;
}

但是,当你把获取的时间传回国内,或者和数据库进行对比,你要是存的是字符串YYYY-MM-dd HH:mm:ss ,那就糟糕了.....因为你传回来的是你在国外的当前时间,这个时间和国内的时间是不一致的,差时区的...........

那怎么办呢???

方法1:(不起作用)

网上找到一种更改 NSLocale  设置 Identifier 为@zh-CN 的,如下面代码,但是我测试的没什么作用.....(测试之前要把自动设置 改为手动,输入一个其他地区)


-(NSString*)getCurrentLocalTimes{
     NSLocale * locale = [NSLocale localeWithLocaleIdentifier:@"zh-CN"];
     NSDateFormatter * formatter = [[NSDateFormatter alloc]init];
     formatter.locale = locale;
     formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
     NSDate * date5 = [NSDate date];
     NSString * nowTime = [formatter stringFromDate:date5];
     NSLog(@"nowTime=%@",nowTime);
}

方法2:

设置NSTimeZone为东八区,就是不管你是在国内还是国外,我获取的时间都是当前的北京时间

-(void)getEastEightAreaCurrentTime{
    
    NSDate * date = [NSDate date];
    NSDateFormatter * df = [[NSDateFormatter alloc]init];
    [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    //    设置东8区
    [df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:8*3600]];
    NSString* now = [df stringFromDate:date];
    //    正确获取天朝时间
    NSLog(@"EastEightAreaTime=%@",now);
    
}

总结:

大多数人的手机的时区都是自动获取的,所以,当你的App获取系统时间的时候,如果是需要当地时间,那么不用管,直接用下面这个方法就行; 

-(NSString*)getCurrentTimes

如果要和北京时间进行比较,那么请用下面的方法设置时区,以免给出国的的用户造成不必要的麻烦;

-(void)getEastEightAreaCurrentTime;

下面提供一些关于时间的文章:

iOS - OC NSTimeZone 时区

NSDate获取当前时间、间隔、年月日、转NSString等方法总结

NSDate 8小时问题-没你想的那么简单

IOS TimemZone根据当前的时区变化时间

猜你喜欢

转载自blog.csdn.net/jiaxin_1105/article/details/81222861