2013-12-17 66 views
2

我提出一個應用程序,它可以準確的時間訪問任何地方所以我們可以說我對GMT時間上傳視頻5:30 AM所以,如果巴基斯坦的用戶看到視頻吧應該在本地時間上傳視頻,而不是格林威治標準時間上午5:30。我正在使用下面的代碼來轉換,但它不適合我。如何GMT時間轉換爲本地時間顯示

NSString *dateStr = @"2013-12-17 05:30 AM"; 

NSDateFormatter *dateFormatter1 = [[NSDateFormatter alloc] init]; 
[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm a"]; 

NSDate *date = [dateFormatter1 dateFromString:dateStr]; 

NSLog(@"date : %@",date); 

NSTimeZone *currentTimeZone = [NSTimeZone localTimeZone]; 

NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init]; 
[dateFormatter2 setDateFormat:@"yyyy-MM-dd HH:mm: a"]; 
[dateFormatter2 setTimeZone:currentTimeZone]; 

NSDate *dateNew = [dateFormatter2 dateFromString:dateStr]; 
NSLog(@"date : %@",date); 

兩個NSLog分別是

date : 2013-12-16 19:30:00 +0000 2013-12-17 12:20:27.006 TimeTesting[1548:f803] 
date : 2013-12-16 19:30:00 +0000 
+1

「它沒有爲我工作」沒有按沒有告訴我們發生什麼事情。請注意,如果你也有「a」 - 你想要「hh」,那麼「HH」是不合適的。還請注意,您尚未設置'dateFormatter1'的時區 - 也許您需要將其設置爲UTC? –

+0

@JonSkeet爲什麼要設置UTC爲dateFormatter是承擔GMT – user3110080

+0

是否肯定?我不確定,在文檔中我不能輕易看到它。由於你沒有告訴我們發生了什麼問題,我只是在黑暗中摸索着解決發生的事情。 *請*告訴我們你看到的是什麼,而不是讓我們猜測。 –

回答

0
-(NSDate *)getLocalTimeFrom:(NSDate *)GMTTime 
{ 
    NSTimeZone *tz = [NSTimeZone localTimeZone]; 
    NSLog(@"%@",tz); 
    NSInteger seconds = [tz secondsFromGMTForDate: GMTTime]; 
    NSLog(@"%ld",(long)seconds); 
    return [NSDate dateWithTimeInterval: seconds sinceDate: GMTTime]; 
} 
+0

此方法將返回您用作其參數的時間的本地時間。 這裏,GMTTIME代表你希望它轉換爲本地時間的絕對時間(或UTCTime)。 –

+0

我不認爲這是解決問題的最佳方案。你所暗示「修復」 A「GMT」日期的問題被錯誤實例就好像它是在用戶所在的區域,但它並沒有解決問題的根源(即A GMT日期應該與時區偏移被實例化0),請參閱下面的答案。每次創建GMT日期時,您的解決方案都需要創建2個NSDate(原始,錯誤的和您的「固定」日期) – tjboneman

0

默認情況下,NSDateFormatter將使用創建一個字符串的日期當與當前區域相關的時區。因此,當你從使用以下方法字符串日期:

[dateFormatter1 setDateFormat:@"yyyy-MM-dd HH:mm a"]; 
NSDate *date = [dateFormatter1 dateFromString:dateStr]; 

你不經意間創建一個使用手機的區域設置時區的日期,所以早上8點GMT值成爲用戶的時區,而不是早上8點GMT上午8點。 所有你需要做的正確的,這是爲您設置用於創建日期爲GMT 0日期格式的語言環境,如下面的代碼說明:

NSString *dateStr = @"2013-12-17 05:30 AM"; 

NSDateFormatter *df = [[NSDateFormatter alloc]init]; 
//explicitly set the timezone for the date formatter, so it will treat dates parsed in as GMT 0 
[df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 
[df setDateFormat:@"yyyy-MM-dd HH:mm a"]; 

NSDate *date = [df dateFromString:dateStr]; 
NSLog(@"GMT date : %@",[df stringFromDate:date]); 

//create a new date formatter to use in displaying in the UI, which by default will use the user's locale and timezone 
NSDateFormatter *userLocaleDF = [[NSDateFormatter alloc]init]; 
[userLocaleDF setDateFormat:@"yyyy-MM-dd HH:mm a"]; 

NSLog(@"date in user's locale/timezone: %@",[userLocaleDF stringFromDate:date]); 
相關問題