iOS-NSDate 相差 8 小时

转载自:http://blog.csdn.net/diyagoanyhacker/article/details/7096612

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系统的基地台,除了会传送当地时间外也包括夏令日光节约时间,做为手机的时间标准,使用者可以自行决定要开启或关闭。值得注意的是,某些国家
有实施「夏日节约时间」的制度,出国时别忘了跟随当地习惯在表上调整一下,这可是机械表没有的功能设计哦!

时间: 2024-10-14 20:46:42

iOS-NSDate 相差 8 小时的相关文章

解决weblogic与系统时间相差8小时的问题

解决weblogic与系统时间相差8小时的问题 在一般情况下weblogic与系统时间是很少会出现时间差的问题,但有可能在某一特定的情况下就会出现,如使用weblogic8版本时可能会出现时差问题: 调整时差方法: 第一步: 1.找到D:\bea\jdk142_08\jre\lib\zi\Etc和D:\bea\jrockit81sp5_142_08\jre\lib\zi\Etc找到这两个文件夹里的Etc这个文件夹,里面就是时区文件, 第二步: 2.将GMT-8这个文件复制一份然后重命名为GMT来

php5.1以上版本时间戳_时间戳与日期格式转换_相差8小时 的解决方案

php5.1以上时间戳会与实际时间相差8小时,解决办法如下 1.最简单的方法就是不要用php5.1以上的版本--显然这是不可取的方法!!! 2.修改php.ini.打开php.ini查找date.timezone 去掉前面的分号= 后面加Asia/Shanghai,重启apache服务器即可--缺点就是如果程序 放到别人的服务器上,不能修改php.ini,那就奈何不得了. 3.在程序中添加时间的初始化的语句的 即:“date_default_timezone_set("Asia/Shanghai

解决mongodb ISODate相差8小时问题

服务端使用mongoose操作mongodb,其中Schema中的日期字段定义如下: date: {type:Date, default:Date.now},//操作日期 插入到mongodb中adte为:"date" : ISODate("2015-08-15T03:26:36.086Z"), 与当前时间相差8小时,客户端采用angular进行操作,在页面上展示的内容为:2015-08-15T03:26:36.086Z 现在通过使用moment.js在客户端进行处

php 时间获取相差8小时

php 时间获取相差8小时 by 伍雪颖 date_default_timezone_set('PRC'); $timeStr = date("Y-m-d H:i:s",time()); 服务器加上这句话刚好可以解决AFNetWorking解析json的问题 Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn't be completed. (Cocoa error 3840.)" (JSO

解决tomcat中jdk1.5运行日志相差8小时问题

tomcat运行日志时间与电脑中的时间相差8小时,原因是因为jdk1.5的原因: 解决办法是在jdk运行的时候加上默认参数: Window->Preferences->Java->Installed JREs,选中一个tomcat正在运行的jre,然后点击edit, 加上运行参数:-Duser.timezone=Asia/Shanghai 如下图所示: 然后点击Finish即可.

告警日志时间与系统时间相差8小时

系统默认的log_timestamps为UTC,与linux系统时间相差8小时 解决方法: SET GLOBAL log_timestamps = SYSTEM;(立即生效,重启mysql服务,失效) 永久生效方法,在/etc/my.cnf中添加 log_timestamps=system 原文地址:https://www.cnblogs.com/tonnytangy/p/11966344.html

Manjaro 与 Windows 双系统时间相差8小时

Manjaro 与 Windows 双系统时间相差8小时 产生原因: Windows 将本地硬件时间作为设定时区(如 UTC+8)的区时,而 Linux 默认将其作为 UTC 时间. 解决方式: 让 Manjaro 不要将其作为 UTC 时间: sudo timedatectl set-local-rtc 1 原文地址:https://www.cnblogs.com/skylee03/p/12230511.html

php晚了8小时 PHP5中的时间相差8小时的解决办法

php页面顶部加一句date_default_timezone_set("Asia/Shanghai");或者直接在php.ini设置date.timezone=Asia/Shanghai PHP5系列版本新增了时区设置,默认为格林威治时间,与中国所在的东8区正好相差8个小时. 方法1: 找到php.ini中的";date.timezone ="这行,将";"去掉,改成"date.timezone = PRC"(PRC:Peo

在MongoVUE中发现插入的时间和实际的时间相差8小时?

在Mongodb使用过程中,发现一个问题,就是我们插入Date类型时会发现保存到mongodb中的数据却晚了8个小时,这是为什么呢?我想大家在使用客户端工具如MongoVUE时,也会发现查询出来的数据也是晚了8个小时的?下面简单描述下原因. 上面的两个问题,我们依次来看是为什么? (1)在Java编码过程中,使用mongodb的java驱动包保存数据时,数据库里的数据比实际时间少了8个小时,为什么? 为了找打原因,我下载了个mongodb的java驱动包,想通过驱动包来找到原因,驱动包如下: 我