iOS-NSDate 相差 8 小時

來源:互聯網
上載者:User

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系統的基地台,除了會傳送當地時間外也包括夏令日光節約時間,做為手機的時間標準,使用者可以自行決定要開啟或關閉。值得注意的是,某些國家有實施「夏日節約時間」的制度,出國時別忘了跟隨當地習慣在表上調整一下,這可是機械錶沒有的功能設計哦。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.