NSDate顯示和時區的關係

在網上看到一篇介紹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...

 

這是一個巴基斯坦人的提問,他不明白爲什麼會這樣?您明白了嗎?你知道了怎麼來正確地顯示時間數字了嗎?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章