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

NSDateFormatter: Дата в соответствии с currentLocale, без года

Это не может быть слишком сложно.

Я хочу показать дату без года. Например: "Авг, 2" (США) или "02.08". (ГЕРМАНИЯ) Он должен работать и для множества других локалей.

Моя единственная идея - сделать нормальный формат с года, а затем удалить часть года из сгенерированной строки.

4b9b3361

Ответ 1

Думаю, вам нужно взглянуть на:

+ (NSString *)dateFormatFromTemplate:(NSString *)template options:(NSUInteger)opts locale:(NSLocale *)locale

В соответствии с документами:

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

Возвращенная строка может содержать не те компоненты, которые заданы в шаблоне, но может, например, использовать локальные корректировки.

Обсуждение

Различные локали имеют разные соглашения для упорядочения компонентов даты. Этот метод используется для получения соответствующей строки формата для заданного набора компонентов для определенной локали (обычно вы используете текущую локаль - см. CurrentLocale).

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

NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSLocale *gbLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];

NSString *dateFormat;
// NOTE!!! I removed the 'y' from the example
NSString *dateComponents = @"MMMMd";  //@"yMMMMd";

dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:usLocale];
NSLog(@"Date format for %@: %@",
[usLocale displayNameForKey:NSLocaleIdentifier value:[usLocale localeIdentifier]], dateFormat);

dateFormat = [NSDateFormatter dateFormatFromTemplate:dateComponents options:0 locale:gbLocale];
NSLog(@"Date format for %@: %@",
[gbLocale displayNameForKey:NSLocaleIdentifier value:[gbLocale localeIdentifier]], dateFormat);

// Output:
// Date format for English (United States): MMMM d, y
// Date format for English (United Kingdom): d MMMM y

Дополнительный код (добавьте это в код выше):

// 
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
formatter.locale = gbLocale;
formatter.dateFormat = dateFormat;
NSLog(@"date: %@", [formatter stringFromDate: [NSDate date]]);

Смотрите здесь: Ссылка на класс NSDateFormatter

Ответ 2

Два примера, которые вы даете, сильно отличаются друг от друга. Один использует имя сокращенного месяца, а другой - 2-значный номер месяца. Один использует порядковый номер дня ( "2-й" ), а другой просто использует двузначный номер дня.

Если вы можете использовать один и тот же общий формат для всех локалей, используйте NSDateFormatter dateFormatFromTemplate:options:locale:.

NSString *localFormat = [NSDateFormatter dateFormatFromTemplate:@"MMM dd" options:0 locale:[NSLocale currentLocale]];

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

Но опять же, это не решит ваши точные потребности из-за совершенно разных форматов, которые вам кажутся для каждой локали.

Ответ 3

Swift 3

let template = "EEEEdMMM"
let locale = NSLocale.current // the device current locale

let format = DateFormatter.dateFormat(fromTemplate: template, options: 0, locale: locale)
let formatter = DateFormatter()
formatter.dateFormat = format

let now = Date()
let whatYouWant = formatter.string(from: now) // Sunday, Mar 5

Играйте с template в соответствии с вашими потребностями.

Doc и примеры здесь, чтобы помочь вам определить нужный шаблон.