iOS-NSDate 相差 8 小时

NSDate存储的是世界标准时(UTC),输出时需要根据时区转换为本地时间


好像是从ios4.1开始[NSDate date];获取的是GMT时间,这个时间和北京时间相差8个小时,以下代码可以解决这个问题

//方法一

- (void)tDate

{

    NSDate *date = [NSDatedate];

    NSTimeZone *zone = [NSTimeZonesystemTimeZone];

    NSInteger interval = [zone secondsFromGMTForDate: date];

    NSDate *localeDate = [date  dateByAddingTimeInterval: interval];  

    NSLog(@"%@", localeDate);

}

方法二

- (NSString*)dateAsString:(NSDate*)date

 {

/* Create a single string expressing a mountain's climbed date, properly localized */

NSString *returnValue = @"";

    NSDateFormatter *dateFormatter = nil;

if (date != nil) {

if (dateFormatter ==nil) {

dateFormatter = [[NSDateFormatteralloc]init];

}

//原文地址:http://blog.csdn.net/diyagoanyhacker/article/details/7096612

//作者:禚来强

[dateFormatter setDateStyle:NSDateFormatterMediumStyle];

[dateFormatter setTimeStyle:NSDateFormatterNoStyle];

[dateFormatter setLocale:[NSLocalecurrentLocale]];

returnValue = [dateFormatter stringFromDate:date];

}

/* As this code uses the current "locale", the date format will be in the format 

     specified by the user's "Region Format" settings.  If you need to use an

     alternate format internally, you can create and use NSLocales, e.g.:

 

     NSLocale *enGBLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];

     [numberFormatter setLocale:enGBLocale];

 

     Doing so will not affect the current user-set language or region format. 

     

     Similarly, while you should always rely on the system and application bundle

     to pick the most appropriate resources for the current user language setting,

     if you need to know what the current user language setting is, you can do

     something like the following:

 

     NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];

     NSArray* languages = [defs objectForKey:@"AppleLanguages"];

     NSString* preferredLang = [languages objectAtIndex:0];

     NSLog(@"Current language is %@", preferredLang);

 

     Note that the iPhone does not support locales in the same way that Mac OS

     does (really only using locales for the Region Format settings) so if you

     try and get an array from standardUserDefaults for the key "AppleLocale",

     this will fail on the iPhone. */

return returnValue;

}


//方法三

+ (NSString *)fixStringForDate:(NSDate *)date 

{

    NSDateFormatter* dateFormatter = [[NSDateFormatteralloc]init];

    [dateFormatter setDateStyle:kCFDateFormatterFullStyle];

    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSString *fixString = [dateFormatter stringFromDate:date]; 

    [dateFormatter release];

    return fixString;

}


方法四

    NSDateComponents *comps = [[NSDateComponentsalloc]init];

    [comps setYear:2010];

    [comps setMonth:8];

    [comps setDay:24];

    [comps setHour:17];

    [comps setMinute:5];

    [comps setTimeZone: [NSTimeZonetimeZoneWithAbbreviation:@"UTC"]];

    NSLog(@"%@", [NSTimeZonetimeZoneWithAbbreviation:@"UTC"]);

    

    NSCalendar *cal = [[NSCalendaralloc]initWithCalendarIdentifier:NSGregorianCalendar];

    NSDate *referenceTime = [cal dateFromComponents:comps];

    NSLog(@"%@", referenceTime);


以下信息为转载

  

GMT、UTC与24时区 等时间概念

 许多人都知道两地时间表简称为GMT或UTC,而世界时区表则通称为World Time,那么GMT与UTC的实质原意又是为何?世界时区又是怎么区分的?面盘上密密麻麻的英文单字代表着什么意义与作用呢?这些都是新手在接触两地时间表或世界时区表时,脑海中所不断浮现的种种疑问,以下将带您一探时区奥妙的究竟。

 

世界时区及国际换日线示意图

 


全球24个时区的划分 
      相较于两地时间表,可以显示世界各时区时间和地名的世界时区表(World Time),就显得精密与复杂多了,通常世界时区表的表盘上会标示着全球24个时区的城市名称,但究竟这24个时区是如何产生的?过去世界各地原本各自订定当地时间,但随着交通和电讯的发达,各地交流日益频繁,不同的地方时间,造成许多困扰,于是在西元1884年的国际会议上制定了全球性的标准时,明定以英国伦敦格林威治这个地方为零度经线的起点(亦称为本初子午线),并以地球由西向东每24小时自转一周360°,订定每隔经度15°,时差1小时。而每15°的经线则称为该时区的中央经线,将全球划分为24个时区,其中包含23个整时区及180°经线左右两侧的2个半时区。就全球的时间来看,东经的时间比西经要早,也就是如果格林威治时间是中午12时,则中央经线15°E的时区为下午1时,中央经线30°E时区的时间为下午2时;反之,中央经线15°W的时区时间为上午11时,中央经线30°W时区的时间为上午10时。以台湾为例,台湾位于东经121°,换算后与格林威治就有8小时的时差。如果两人同时从格林威治的0°各往东、西方前进,当他们在经线180°时,就会相差24小时,所以经线180°被定为国际换日线,由西向东通过此线时日期要减去一日,反之,若由东向西则要增加一日。

 

格林威治标准时间GMT
      十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度。观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间,这就是我们耳熟能详的「格林威治标准时间」(Greenwich Mean Time,简称G.M.T.)的由来,标示在手表上,则代表此表具有两地时间功能,也就是同时可以显示原居地和另一个国度的时间。

 

世界协调时间UTC
      多数的两地时间表都以GMT来表示,但也有些两地时间表上看不到GMT字样,出现的反而是UTC这3个英文字母,究竟何谓UTC?事实上,UTC指的是Coordinated Universal Time- 世界协调时间(又称世界标准时间、世界统一时间),是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准,不过对于现行表款来说,GMT与UTC的功能与精确度是没有差别的。

 

夏日节约时间DST
      所谓「夏日节约时间」Daylight Saving Time(简称D.S.T.),是指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用,在英国则称为夏令时间(Summer Time)。这个构想于1784年由美国班杰明·富兰克林提出来,1915年德国成为第一个正式实施夏令日光节约时间的国家,以削减灯光照明和耗电开支。自此以后,全球以欧洲和北美为主的约70个国家都引用这个做法。目前被划分成两个时区的印度也正在商讨是否全国该统一实行夏令日光节约时间。欧洲手机上也有很多GSM系统的基地台,除了会传送当地时间外也包括夏令日光节约时间,做为手机的时间标准,使用者可以自行决定要开启或关闭。值得注意的是,某些国家有实施「夏日节约时间」的制度,出国时别忘了跟随当地习惯在表上调整一下,这可是机械表没有的功能设计哦!

你可能感兴趣的:(iOS,技术)