溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

NSDate,NSDateFormatter以及時區(qū)轉換

發(fā)布時間:2020-07-02 10:22:16 來源:網(wǎng)絡 閱讀:4441 作者:dragon_cao 欄目:開發(fā)技術

NSDate是ios中的一個保存時間的對象,其中包含了時區(qū)。通過NSLog輸出的[NSDate date]是GTM時區(qū)的時間,是0時區(qū)。而中國大陸采用的是正8區(qū)。

NSLog(@"GTM 時間:%@",[NSDate date]);

2013-07-09 15:16:38.007 demo[14267:13d03] GTM 時間:2013-07-09 07:16:38 +0000

通過NSDateFormatter將NSDate類的對象輸出設置好的格式。NSDateFormatter采用ios操作系統(tǒng)的時區(qū)作為默認值。操作系統(tǒng)的時區(qū)通過[[NSTimeZone localTimeZone] name]獲取到。

   NSLog(@"[[NSTimeZone localTimeZone] name] is %@",[[NSTimeZone localTimeZone] name]);


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


   [dateFormatter setDateFormat:@"YYYY-MM-d HH:mm:ss"];

將NSDateFormatter對象的時區(qū)設置"Asia/Shanghai" ,為正8區(qū),輸出結果就是我們現(xiàn)在看到的時間

   [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]];

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

   NSLog(@"時區(qū):%@ 當?shù)貢r間:%@",[[dateFormatter timeZone] name], dStr);

   將NSDateFormatter對象的時區(qū)設置"GMT" ,為0區(qū),輸出結果就是看到[NSDate date]的值。
   [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
   dStr = [dateFormatter stringFromDate:[NSDate date]];

   NSLog(@"時區(qū):%@ 當?shù)貢r間:%@",[[dateFormatter timeZone] name], dStr);


將NSDateFormatter對象的時區(qū)設置"Asia/Tokyo" ,為正9區(qū),輸出結果就是日本用戶看到的時間
   [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Tokyo"]];
   dStr = [dateFormatter stringFromDate:[NSDate date]];

   NSLog(@"時區(qū):%@ 當?shù)貢r間:%@",[[dateFormatter timeZone] name], dStr);    


可以看到,NSDateFormatter根據(jù)時區(qū)設置,將時間進行調整。 如果加上時區(qū)的前者調整,其實是和GTM的時間是一致的。

NSDateFormatter也僅僅是將時間按照不同時區(qū)的設置進行顯示,NSLog(@"GTM 時間:%@",[NSDate date]);是在GTM時區(qū)下顯示時間。因此如果你看到的時間比本地時區(qū)顯示的時間有差異,加了多少小時,或者減了多少小時。

這點,在所有的計算機系統(tǒng)中都是一樣的,包括linux ,windows,solaris,aix等等。

NSDateFormatter也可以將指定格式的字符串轉換為NSDate。這是其他語言中常見的時間轉字符串,字符串轉時間的操作方法。在ios的objective-c開發(fā)中,使用NSDateFormatter類來實現(xiàn)。不過,這里加了一點,時區(qū)。如果不加,就是系統(tǒng)默認值。

   [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Shanghai"]];

   NSDate *dateFormatted=[dateFormatter dateFromString:@"2013-07-09 12:00:00"];

   NSLog(@"GTM 時間:%@",dateFormatted);

   [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Tokyo"]];

    dateFormatted=[dateFormatter dateFromString:@"2013-07-09 12:00:00" ];

   NSLog(@"GTM 時間:%@",dateFormatted);

   [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

   dateFormatted=[dateFormatter dateFromString:@"2013-07-09 12:00:00"];

   NSLog(@"GTM 時間:%@",dateFormatted);




接著講NSCalendar。

NSCalendar是ios中的一個保存日歷數(shù)據(jù)的對象,其中也有時區(qū)設置,道理和NSDate一樣的。NSCalendar可以將NSDate對象在日歷中是一些屬性特征顯示出來。NSCalendar根據(jù)設置的時區(qū)進行計算,將NSDate對象是一年中的第幾周,一個月中的第幾周等等計算出來。

NSCalendar還涉及到一個類NSDateComponents,兩者結合,可以將某些屬性拆分出來,也可以通過它來設置NSDate,也可以實現(xiàn)NSDate的加減和比較運算。

NSDateComponents也可以設置時區(qū),設置年月日時分秒。

NSCalendar *localCalendar= [NSCalendar currentCalendar];

unsigned unitFlags = NSTimeZoneCalendarUnit|NSYearCalendarUnit | NSMonthCalendarUnit |NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit;

unitFlags是一個設置,表示NSDateComponents會保存那些屬性,一般是時分秒天月年等等,還有星期幾,哪個季度,哪個月度,這里將時區(qū)也一并保存了。
   NSDateComponents *comps = [localCalendar components:unitFlags fromDate:[NSDate date]];


   NSLog(@"時區(qū):%@ hour is %d",[[comps timeZone] name] ,comps.hour);


同樣,也可以通過NSDateComponents設置得到一個NSDate對象。

   [comps setTimeZone:[NSTimeZone timeZoneWithName:@"Asia/Tokyo"]];

   [comps setSecond:00];
   [comps setMinute:00];
   [comps setHour:12];

   [comps setDay:9];
   [comps setMonth:7];
   [comps setYear:2013];

   NSLog(@"時區(qū):%@ hour is %d",[[comps timeZone] name] ,comps.hour);

   NSDate *compsDate=[localCalendar dateFromComponents:comps];

   NSLog(@"GTM 時間:%@",compsDate);



總之,理解透了,也就這么回事。將時區(qū)理解成日期時間的另一個屬性。像大陸的下午兩點和美國的下午兩點,不是一個時間,因為還有時區(qū)這個前提條件存在。


測試結果如下:

2013-07-09 15:16:38.006 demo[14267:13d03] test begin.....................
2013-07-09 15:16:38.007 demo[14267:13d03] GTM 時間:2013-07-09 07:16:38 +0000
2013-07-09 15:16:38.007 demo[14267:13d03] [[NSTimeZone localTimeZone] name] is Asia/Shanghai
2013-07-09 15:16:38.008 demo[14267:13d03] 時區(qū):Asia/Shanghai 當?shù)貢r間:2013-07-9 15:16:38
2013-07-09 15:16:38.008 demo[14267:13d03] 時區(qū):GMT 當?shù)貢r間:2013-07-9 07:16:38
2013-07-09 15:16:38.009 demo[14267:13d03] GTM 時間:2012-07-09 04:00:00 +0000
2013-07-09 15:16:38.009 demo[14267:13d03] GTM 時間:2012-07-09 03:00:00 +0000
2013-07-09 15:16:38.009 demo[14267:13d03] GTM 時間:2012-07-09 12:00:00 +0000
2013-07-09 15:16:38.010 demo[14267:13d03] the end.....................
2013-07-09 15:16:38.010 demo[14267:13d03] ...............................
2013-07-09 15:16:38.010 demo[14267:13d03] test begin.....................
2013-07-09 15:16:38.010 demo[14267:13d03] 時區(qū):Asia/Shanghai hour is 15
2013-07-09 15:16:38.011 demo[14267:13d03] 時區(qū):Asia/Tokyo hour is 12
2013-07-09 15:16:38.011 demo[14267:13d03] GTM 時間:2013-07-09 03:00:00 +0000
2013-07-09 15:16:38.011 demo[14267:13d03] the end.....................

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI