将NSString转换为NSDate转换 - 结果不正确

时间:2013-12-07 20:52:16

标签: ios objective-c cocoa-touch nsdate nsdateformatter

简而言之,我计划通过将+0800应用于时区来获取当前的dateTime,更改时间并将其设置为马来西亚时间本地。

结果出乎意料:

-(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;
}

结果:

for NSLog Append:2013-12-07 23:59:17 +0800

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个:

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

答案 2 :(得分: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。