Подтвердить что ты не робот

Как отформатировать текущую дату для пользовательской локали?

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

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.

Помощь будет принята с благодарностью или указатель на "документ", где он описал.

4b9b3361

Ответ 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.