2016-05-31 5 views
0

У меня есть UIDataPicker в моем ViewController с местоположением по умолчанию, когда мой пользователь заканчивает выбрать дату я запускаю этот код:NSDateFormatterLongStyle строка NSDate

NSString *dateString = [NSDateFormatter localizedStringFromDate:[self.dataPicker date] 
                  dateStyle:NSDateFormatterLongStyle 
                timeStyle:NSDateFormatterNoStyle]; 

С этим кодом сможет хранение даты в следующем формате:

31 мая 2016

Позже в моем коде мне нужно преобразовать эту строку в формат реальной даты, для этого я использую треску e ниже:

-(NSDate*)convertStringToDate:(NSString*)date{ 
    NSString *dateString = date; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
    [dateFormatter setDateFormat:@"MM/dd/yyyy"]; 

    return [dateFormatter dateFromString:dateString]; 
} 

Но этот код возвращает нулевое значение. Поскольку datepicker установлен по умолчанию, моя система может получать любой формат даты, но в конце я хочу, чтобы он был преобразован в формат en_us.

Как я могу решить эту проблему?

+0

посмотреть обучающую: https: //iosdevcenters.blogspot.com/2016/03/nsdateformatter-in-swift.html –

+0

'31 мая 2016' против' MM/dd/yyyy' Вы видите тот же формат там? Формат 'MM/dd/yyyy' не соответствует формату строки (' 31 мая 2016 года). – Larme

+0

@ Larme, я вижу ... теперь давайте изменим язык устройства на французский, формат будет отличаться от 31 мая 2016 года, я думаю, мне нужно преобразовать дату в локаль ... – Lacrifilm

ответ

2

Не храните дату в виде строки; сохраните его как смещение, в секундах, с некоторой контрольной даты.

т.е.:

uint64_t offset = (uint64_t)[[self.dataPicker date] timeIntervalSinceReferenceDate]; 
// store this 64-bit unsigned integer. 

Это занимает меньше места и быстрее конвертировать в/из NSDate объекта.

Вы можете оставить смещение как NSTimeInterval (64-бит с плавающей точкой double), если вы предпочитаете, но вы не хранение Дата & время, uint64_t должен делать ...

1

Строка форматирования зависит от используемой вами локали. Из localizedStringFromDate документации:

Возвращает строковое представление заданной даты, отформатированную для текущей локали, используя указанные даты и время стилей.

Этот метод использует формат даты, сконфигурированный с текущими настройками по умолчанию . Возвращаемая строка такая же, как если вы настроили и используется форматчик даты, как показано в следующем примере:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
formatter.formatterBehavior = NSDateFormatterBehavior10_4; 
formatter.dateStyle = dateStyle; formatter.timeStyle = timeStyle; 
NSString *result = [formatter stringForObjectValue:date]; 

Значит, вы должны сделать следующий:

-(NSDate*)convertStringToDate:(NSString*)dateString { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.formatterBehavior = NSDateFormatterBehavior10_4; 
    dateFormatter.dateStyle = NSDateFormatterLongStyle; 
    dateFormatter.timeStyle = NSDateFormatterNoStyle; 
    return [dateFormatter dateFromString:dateString]; 
} 
+1

'ММ' должен соответствовать' 05', а не 'Май', нет? – Larme

+1

Право, теперь, если мой пользователь использует мое приложение с другим местоположением? Как французский, японский, португальский ... этот код может справиться? (как только мой выборщик установлен на значение по умолчанию) – Lacrifilm

+0

Да, строка форматирования должна зависеть от языка, который вы использовали для создания даты. Обновлено решение соответственно. – sgl0v

1

Используйте этот код ,

-(NSDate*)convertStringToDate:(NSString*)date{ 
    NSString *dateString = date; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
    [dateFormatter setDateFormat:@"MMM d, yyyy"]; 

    return [dateFormatter dateFromString:dateString]; 
} 

надеюсь, что его полезно

Смежные вопросы