Как обрабатывать различные форматы времени даты, используя NSDateFormatter
У меня есть String с форматом datetime: "YYYY-MM-DD HH: MM: SS".
Я использую это в своем исходном коде:
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"%e. %B %Y"];
NSString *test = [formatter stringFromDate:@"2010-01-10 13:55:15"];
Я хочу конвертировать из "2010-01-10 13:55:15" в "10. января 2010".
Но моя реализация не работает.
Что здесь не так?
Большое спасибо заранее и с наилучшими пожеланиями.
Обновленный исходный код:
[NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4];
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"%Y-%m-%d %H:%M:%S"];
NSString *test1 = [formatter stringFromDate:@"2010-01-10 13:55:15"];
NSDateFormatter *formatter1 = [[[NSDateFormatter alloc] init] autorelease];
[formatter1 setDateFormat:@"%d. %M4 %Y"];
NSString *test2 = [formatter1 stringFromDate:test1];
Ответы
Ответ 1
Формат даты может обрабатывать только один формат за раз. Вы должны принять такой подход:
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date = [f dateFromString:@"2010-01-10 13:55:15"];
NSDateFormatter *f2 = [[NSDateFormatter alloc] init];
[f2 setDateFormat:@"d. MMMM YYYY"];
NSString *s = [f2 stringFromDate:date];
s теперь будет "10. Январь 2010"
Ответ 2
Вот несколько примеров работы с форматировщиками данных из моего кода. Вы должны иметь возможность взять любую из этих функций и настроить ее для своего формата.
ИСПОЛЬЗОВАНИЕ
NSDate *today = [NSDate date];
NSDateFormatter *dateFormatter = [Constants getTitleDateFormatter];
NSString *dateString = [dateFormatter stringFromDate:today];
[dateFormatter release];
ФУНКЦИИ
+ (NSDateFormatter *) getDateFormatterWithTimeZone {
//Returns the following information in the format of the locale:
//YYYY-MM-dd HH:mm:ss z (Z is time zone)
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[NSLocale currentLocale]];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
[dateFormatter setTimeStyle:NSDateFormatterLongStyle];
return dateFormatter;
}
+ (NSDateFormatter *)dateFormatterWithoutYear {
NSDateFormatter *dateFormatter = [Constants getDateFormatterWithTimeZone];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *format = [dateFormatter dateFormat];
format = [format stringByReplacingOccurrencesOfString:@"/yy" withString:@""];
NSRange secondSpace;
secondSpace.location = format.length-2;
secondSpace.length = 1;
format = [format stringByReplacingCharactersInRange:secondSpace withString:@""];
[dateFormatter setDateFormat:format];
return dateFormatter;
}
+ (NSDateFormatter *) dateFormatterMonthDayOnly {
NSDateFormatter *dateFormatter = [Constants getDateFormatterWithTimeZone];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
NSString *format = [dateFormatter dateFormat];
format = [format stringByReplacingOccurrencesOfString:@"/yy" withString:@""];
NSRange range;
range.location = 0;
range.length = 3;
format = [format substringWithRange:range];
[dateFormatter setDateFormat:format];
return dateFormatter;
}
+ (NSDateFormatter *) getTitleDateFormatter {
//Returns the following information in the format of the locale:
//MM-dd-yyyy hh:mm:ssa
NSDateFormatter *dateFormatter = [Constants getDateFormatterWithTimeZone];
[dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
NSString *format = [dateFormatter dateFormat];
NSRange secondSpace;
secondSpace.location = format.length-2;
secondSpace.length = 1;
format = [format stringByReplacingOccurrencesOfString:@"/" withString:@"-"];
format = [format stringByReplacingCharactersInRange:secondSpace withString:@""];
[dateFormatter setDateFormat:format];
return dateFormatter;
}
Ответ 3
Прежде всего, убедитесь, что вы установили, что поведение 10.4 - более современное, лучше работает в моем опыте.
[dateTimeFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
Затем вы не можете использовать один и тот же формат для разбора и форматирования, если у них есть 2 разных строковых представления, поэтому используйте 2 форматирования или измените формат строки между синтаксическим разбором и форматированием.
Также убедитесь, что вы учитываете параметры форматирования:
http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/DataFormatting/Articles/dfDateFormatting10_4.html#//apple_ref/doc/uid/TP40002369-SW1
нижний регистр - это день недели, нижний регистр - день месяца.
В течение месяца используйте MMMM, а не B.
Ответ 4
Вы хотите использовать [NSFormatter dateFromString:]
, чтобы преобразовать вашу строковую дату в экземпляр NSDate
. Оттуда вы хотите использовать stringFromDate
с NSDate
, а не строку, как вы писали выше. Я не уверен в использовании одного и того же NSDateFormatter для разбора и форматирования. Для обработки разных стилей формата вам могут понадобиться два отдельных экземпляра.