Как отформатировать текущую дату для пользовательской локали?
У меня есть этот код, где я пытаюсь получить текущую дату и отформатировать ее в текущей локали.
NSDate *now = [NSDate date]; // gets current date
NSString *sNow = [[NSString alloc] initWithFormat:@"%@",now];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"mm-dd-yyyy"];
insertCmd = [insertCmd stringByAppendingString: formatter setDateFormat: @"MM.dd.yyyy"];
Я знаю, что последняя строка неверна, но не может показаться, что это понятно... "insertCmd" - это NSString, который я создаю для команды FMDB.
Помощь будет принята с благодарностью или указатель на "документ", где он описал.
Ответы
Ответ 1
Я бы не использовал setDateFormat
в этом случае, потому что он ограничивает формат даты до определенного формата даты (doh!) - вам нужен динамический формат в зависимости от локали пользователя.
NSDateFormatter предоставляет вам набор встроенных стилей даты/времени, которые вы можете выбрать, то есть NSDateFormatterMediumStyle, NSDateFormatterShortStyle и т.д.
Итак, что вам нужно сделать:
NSDate* now = [NSDate date];
NSDateFormatter* df = [[NSDateFormatter alloc] init];
[df setDateStyle:NSDateFormatterMediumStyle];
[df setTimeStyle:NSDateFormatterShortStyle];
NSString* myString = [df stringFromDate:now];
Это предоставит вам строку со средней длиной даты и короткое время, все в зависимости от пользовательской локали. Поэкспериментируйте с настройками и выберите то, что вам нравится.
Здесь список доступных стилей: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/c/tdef/NSDateFormatterStyle
Ответ 2
В дополнение к jiayow ответ вы можете указать свой собственный "шаблон", чтобы получить локализованную версию:
+ (NSString *)formattedDate:(NSDate *)date usingTemplate:(NSString *)template {
NSDateFormatter* formatter = [NSDateFormatter new];
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:template options:0 locale:formatter.locale];
return [formatter stringFromDate:date];
}
Пример использования для локализации US/DE:
NSLocale *enLocale = [NSLocale localeWithLocaleIdentifier:@"en_US"];
NSLocale *deLocale = [NSLocale localeWithLocaleIdentifier:@"de"];
// en_US: MMM dd, yyyy
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"ddMMMyyyy" options:0 locale:enLocale];
// de: dd. MMM yyyy
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"ddMMMyyyy" options:0 locale:deLocale];
// en_US: MM/dd/yyyy
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"ddyyyyMM" options:0 locale:enLocale];
// de: dd.MM.yyyy
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"ddyyyyMM" options:0 locale:deLocale];
// en_US MM/dd
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"MMdd" options:0 locale:enLocale];
// de: dd.MM.
formatter.dateFormat = [NSDateFormatter dateFormatFromTemplate:@"MMdd" options:0 locale:deLocale];
Ответ 3
Если вам нужна локализованная дата и время, это даст вам:
NSString *localizedDateTime = [NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterShortStyle timeStyle:NSDateFormatterShortStyle];
В приведенном выше коде не указаны локализованные дата и время.
Ответ 4
Вот версия Swift 5 @JiaYou ответ:
func format(date: Date) -> String {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .none
return formatter.string(from: date)
}
Здесь мне нужна только дата, поэтому я указываю timeStyle
как none
.