2013-12-07 81 views
0

簡而言之,我計劃獲取當前日期時間,通過將時間應用於+0800來改變時間並使其位於馬來西亞時區。將NSString轉換爲NSDate轉換 - 不正確的結果

結果是出乎意料:

-(NSDate *)departureDateTime 
{ 
    NSDate *date = [NSDate date]; 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
    NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date]; 
    [components setHour: 7]; 
    [components setMinute: 59]; 
    [components setSecond: 17]; 

    NSDate *newDate = [gregorian dateFromComponents: components]; 

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"yyyy-mm-dd HH:mm:ss Z"]; 
    [dateFormat setLocale:[NSLocale currentLocale]]; 


    NSString *newDateString = [NSString stringWithFormat:@"%@",newDate]; 
    NSString *maskString = [NSString stringWithFormat:@"%@", [newDateString substringToIndex:20]]; 
    NSString *append = [maskString stringByAppendingString:@"+0800"]; 
    NSLog(@"%@",append); 


    NSDate *finalLocalDate = [dateFormat dateFromString:append]; 

    return finalLocalDate; 
} 

結果:

爲NSLog的追加:2013-12-07 23:59:17 +0800

但finalLocalDate:2013-01-07 15:59:17 +0000

+0

您似乎並未在任何地方設置時區,因此所有日期轉換均以當地時區爲單位。 NSDate將始終以GMT格式打印。 –

+0

順便說一句,要格式化月份使用「MM」,而不是「毫米」。 –

回答

1

用更短的解決方案找到了答案,所以我在這裏發佈信息,以防將來幫助任何人。

返回,問題是不同的時區,以便通過加入這一行的

[components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:(+0*3600) ] ]; 

我們設置時區系統時區,然後我們去掉不必要的代碼:

-(NSDate *)departureDateTime 
{ 
    NSDate *date = [NSDate date]; 
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
    NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date]; 

    [components setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:(+0*3600) ] ]; 
    [components setHour: 7]; 
    [components setMinute: 59]; 
    [components setSecond: 17]; 

    NSDate *newDate = [gregorian dateFromComponents: components]; 
    NSLog(@"%@",newDate); 

    return newDate; 
} 

正確的結果: 2013-12-08 07:59:17 +0000

+0

目前尚不清楚你在做什麼,但如果NSDate在當地時間打印,那麼你做錯了。 NSDate應該包含GMT。 –

+0

事實上,您似乎將時區設置爲GMT - 「(+ 0 * 3600)」爲零 - 因此您沒有獲得任何時區更正。 (這幾乎肯定不是你想要的。) –

+0

@HotLicks每當我得到NSDate的結果-8小時不同於我的系統時間(馬來西亞)。這是什麼原因? – Ben

0

試試這個:

NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; 
NSDate *malaysianTime = [NSDate dateWithTimeIntervalSince1970:now+(8*60*60)]; //8h in seconds 
+0

謝謝,我試過了,你的解決方案也可以工作。 – Ben

0

如果您的計算機運行在正確的時區,請不要設置時區。

創建newDate值,然後 -

NSDateFormatter* fmt = [[NSDateFormatter alloc] init]; 
[fmt setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"]; 
NSString* printableDate = [fmt stringFromDate:newDate]; 

NSLog(@"The date is %@", printableDate); 

只有設置時區(在NSCalendar和NSDateFormatter)如果所需的時區目前不是電腦/手機正在使用一個。

請注意,如果您直接將NSLog newDate打印在GMT時區中。這是它應該是的方式 - 你總是使用NSDateFormatter打印日期。當你直接NSLog一個NSDate時,你可以通過設計得到GMT。