2013-12-07 69 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。