在网上看到一篇介绍NSDate的博文。在它的“NSDate初始化“章节,说在使用  NSLog(@"当前时间 date = %@",[NSDate date]);时,显示出来的时间不是自己时区的时间,比我们小8个小时。因此判断该问题是时区问题。

好,我承认作者判断的很对,但是他给出的解决方法,却令人很意外。这个点对于理解[NSDate date]有很大的误导和迷惑性。

他的部分代码如下:

// 获取当前日期

NSDate *date = [NSDatedate];

// 打印结果: 当前时间date = 2013-08-16 09:00:04 +0000

NSLog(@"当前时间 date = %@",date);

// 获取从某个日期开始往前或者往后多久的日期,此处60代表60秒,如果需要获取之前的,将60改为-60即可

date = [[NSDate alloc]initWithTimeInterval:60 sinceDate:[NSDate date]];

//打印结果:当前时间 往后60s的时间date = 2013-08-16 09:01:04 +0000

NSLog(@"当前时间 往后60s的时间date = %@",date);

PS:测试时时间是下午5点,但是得到的当前时间却是上午9点,相差了8小时,是时区的问题

NSTimeZone *zone =[NSTimeZone systemTimeZone];

NSInteger interval = [zonesecondsFromGMTForDate: date];

NSDate *localDate =[date  dateByAddingTimeInterval: interval];

// 打印结果 正确当前时间 localDate = 2013-08-16 17:01:04 +0000

NSLog(@"正确当前时间 localDate = %@",localDate);

因为我们在正8区,而使用NSLog显示[NSDatedate]时,显示的时间是GTM时区的时间。

作者将[NSDate date]的结果加上8×60×60,得到的时间就是我们正8区看到的时间。

好吧,不得不说这个方法得到的结果是符合要求的,显示时间数字是一致的了。

下面说这个方法的不当之处。它给人一种误导,[NSDate date]得到的时间是应该加8小时,才能正确显示符合我们时区的时间。

何必呢?不就是要[NSDate date]符合本时区的时间数字显示出来吗?何必认为修改时间数值呢?

NSDate对象的显示结果不符合,却去修改对象本身,真真是舍本逐末。

刚好在stackoverflow.com上找到一帖,可以用来解释这个问题。呵呵。

http://stackoverflow.com/questions/4547379/nsdate-is-not-returning-my-local-time-zone-default-time-zone-of-device

My local and default time zone is GMT +5 but when I get date and time byNSDate it return me GMT date and time.

For example the code and output from my code while testing on device isas, [device time zone Islamabad GMT +5]

NSTimeZone *lo = [NSTimeZonelocalTimeZone];

NSLog(@" - current  local timezone  is %@",lo); // GMT +5

2010-12-28 20:56:11.785 Done[484:307]  - current local timezone  is  Local Time Zone (Asia/Karachi (GMT+05:00)offset 18000)

NSTimeZone *df = [NSTimeZonedefaultTimeZone];

NSLog(@" - current  default timezone  is %@",df); // GMT +5

2010-12-28 20:56:11.790 Done[484:307]  - current default timezone  is  Asia/Karachi (GMT+05:00) offset 18000

NSDate *cDate = [NSDatedate];

NSLog(@"current date byNSDate %@",cDate); //but NSDate show GMT

2010-12-28 20:56:11.794 Done[484:307] current date by NSDate2010-12-28 15:56:11 GMT

NSDateFormatter*dateFormatter = [[NSDateFormatter alloc] init];

dateFormatter.dateFormat =@"yyyy-MM-dd'T'HH:mm";

//// NSTimeZone *gmt =[NSTimeZone ]

NSTimeZone *gmt = [NSTimeZonetimeZoneWithAbbreviation:@"GMT+05:00"];

[dateFormattersetTimeZone:gmt];

NSString *timeStamp =[dateFormatter stringFromDate:[NSDate date]];

NSLog(@" date stringobject  %@" ,timeStamp);   // string From Date is GMT +5

2010-12-28 20:56:11.802 Done[484:307]  date string object  2010-12-28T20:56

NSDate *datef =[dateFormatter dateFromString:@"2010-12-28T20:56"];

NSLog(@" date object%@" ,datef);  // the date form abovestring gives again GMT

2010-12-28 20:56:11.809 Done[484:307]  **date object 2010-12-28 15:56:00 GMT**

Why is NSDate not giving local current time? Please help...

这是一个巴基斯坦人的提问,他不明白为什么会这样?您明白了吗?你知道了怎么来正确地显示时间数字了吗?

NSDate显示和时区的关系的更多相关文章

  1. Centos修改时间显示的时区,将UTC修改为CST

    问题说明: 今天一同事反应,系统的时间不对和正常的时间差8个小时.就登录主机看了下时间 系统时间显示为: # date Fri Dec :: UTC # 备注:查看了下,正好和当前的时间差了8个小时. ...

  2. Linux命令之pstree - 以树状图显示进程间的关系

    pstree命令以树状图显示进程间的关系(display a tree of processes).ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰.在Linux系 ...

  3. [Linux] Linux命令之pstree - 以树状图显示进程间的关系

    转载自: http://codingstandards.iteye.com/blog/842156 pstree命令以树状图显示进程间的关系(display a tree of processes). ...

  4. eclipse显示包的层次关系

    如何在eclipse中显示包的层次关系呢?如下图所示

  5. 【转帖】linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York

    linux date 显示指定时区的时间 借助TZ 环境变量 export TZ=Asia/Shanghai 或 America/New_York 2015-02-10 10:58:22 youcha ...

  6. iOS开发-NSDate获取当前时区时间

    NSDate Date默认显示的是格林尼治所在地的标准时间(GMT),转换为中国时区需要加上八个小时,针对与这个情况你可以直接在获取时间之后加上八个小时,也可以转换到当前时区,都很简单,代码参考如下: ...

  7. NSDate获取当前时区的时间

    [NSDate date]获取的是GMT时间,要想获得某个时区的时间,以下代码可以解决这个问题 NSDate *date = [NSDate date]; NSTimeZone *zone = [NS ...

  8. rpmgraph - 显示 RPM 软件包依赖关系图

    SYNOPSIS rpmgraph PACKAGE_FILE ... DESCRIPTION rpmgraph 使用 PACKAGE_FILE 参数来产生一个软件包依赖关系图.每个 PACKAGE_F ...

  9. 『片段』C# DateTime 时间相减 和 时区的关系

    本文只是基础代码片段,直接先写 结论: C# DateTime 时间相减 —— 和 时区无关,只和时间值有关. 运行结果: 测试代码: using System; using System.Colle ...

随机推荐

  1. yii 笔记

    Yii1.1: $_GET 可以表示为 Yii::app()->request->getQuery() $_POST 可以表示为 Yii::app()->request->po ...

  2. 屏幕分辨率(QQVGA、QVGA、VGA、XGA、WXGA、WUXGA和WSXGA+)

    TFT屏幕 TFT ( Thin Film Transistor 薄膜晶体管) ,是有源矩阵类型液晶显示器(AM-LCD)中的一种,TFT在液晶的背部设置特殊光管,能够“主动的”对屏幕上的各个独立的象 ...

  3. hdu5067Harry And Dig Machine(TSP旅行商问题)

    题目链接: huangjing 题意:给出一幅图.图中有一些点,然后从第1个点出发,然后途径全部有石头的点.最后回到原点,然后求最小距离.当初作比赛的时候不知道这就是旅行商经典问题.回来学了一下. 思 ...

  4. Win7 64位下配置Qt5.3和Wincap

         最近在学网络编程,想在windows下用Qt做个网络抓包工具,就要用到WinPcap,而我的电脑的系统是Win7 64位,qt版本是Qt 5.3.1 for Windows 64-bit ( ...

  5. NS2仿真:使用NS仿真软件模拟简单网络模型

    NS2仿真实验报告1 实验名称:使用NS仿真软件模拟简单网络模型 实验日期:2015年3月2日~2015年3月7日 实验报告日期:2015年3月8日 一.实验环境(网络平台,操作系统,网络拓扑图) 运 ...

  6. 开发日志_Jan.9

    今天主要工作为修改昨天的碰撞引擎不符合预期的部分. 经过了昨天的工作,碰撞算法已经初见雏形.但是主要有两个问题: 碰撞反弹的方向与预期不符合 碰撞后球与机器人存在一个"黏在一起"的 ...

  7. ios内存详解

    IOS以及Mac os都是基于Unix/linux改造出来的,而在内存管理方面也沿用了Unix/Linux的内存管理机制. 下面主要说的是IOS系统,有很多比较喜欢捣鼓的吧友肯定自己清理过机器的内存, ...

  8. 高仿QQ即时聊天软件开发系列之三登录窗口用户选择下拉框

    上一篇高仿QQ即时聊天软件开发系列之二登录窗口界面写了一个大概的布局和原理 这一篇详细说下拉框的实现原理 先上最终效果图 一开始其实只是想给下拉框加一个placeholder效果,让下拉框在未选择未输 ...

  9. JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法

    1. JSON.parse(jsonString): 在一个字符串中解析出JSON对象 var str = '[{"href":"baidu.com",&quo ...

  10. ZOJ3556 How Many Sets I(容斥)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud How Many Sets I Time Limit: 2 Seconds     ...