настройка формата даты для NSDateFormatter

Я пытаюсь установить формат даты для чего-то вроде «2011-04-21 03:31:37.310396». Я думаю, что не правильно понимаю доли секунды. Я просматриваю http://unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns, чтобы узнать, как его указать, и я думаю, что моя проблема связана с самим форматом.

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ssSSSSSS";     
NSDate* serverDate = [dateFormatter dateFromString:stringFormOfDate];    

Помощь?


person Joey    schedule 21.04.2011    source источник
comment
Является ли недостающая точка между секундами и микросекундами просто опечаткой в ​​вашем сообщении?   -  person Cory Powers    schedule 22.04.2011
comment
Откуда ты знаешь, что это неправильно? Попробуйте сравнить его со значением миллисекунды.   -  person Sulthan    schedule 30.10.2011


Ответы (2)


пытаться

NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS";     
NSDate* serverDate = [dateFormatter dateFromString:@"2011-04-21 03:31:37.310396"]; 

NSLog(@"%@", serverDate);

Я думаю, вы, вероятно, забыли точку

person suprandr    schedule 23.12.2011
comment
Хотя это работает, обратите внимание, что вывод NSDateFormatter ограничен миллисекундами. Любые символы формата S после 3 будут давать 0. То же самое относится к созданию даты. Временной интервал для примера дает: 325063897,310000. Так что на самом деле это может не ответить на вопрос, поскольку 396 микросекунд потеряны. (проверено на OSX, а не на iPhone) - person zaph; 15.07.2013

Согласно комментарию Зафа в другом ответе: максимальное количество S равно 3. Просто создайте нули.

E.g.

dateFormatter.dateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS"; // Last 3 'S' ignored.  

Then @"2011-04-21 03:31:37.311396" will produce 2011-04-21 03:31:37.311000

Чтобы сохранить полную микросекундную точность, попробуйте эту магию:

-(NSDate *)_dateFromUtcString:(NSString *)utcString{
    if(!utcString){
        return nil;
    }
    static NSDateFormatter *df = nil;
    if (df == nil) {
        df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        [df setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
    }

    NSArray* parts = [utcString componentsSeparatedByString:@"."];
    NSDate *utcDate = [df dateFromString:parts[0]];
    if(parts.count > 1){
        double microseconds = [parts[1] doubleValue];
        utcDate = [utcDate dateByAddingTimeInterval:microseconds / 1000000];
    }
    return utcDate;
}

Теперь NSString "2011-04-21 03:31:37.310396" будет полностью проанализирован до NSDate 2011-04-21 03:31:37.310396

person malhal    schedule 10.12.2014