Obj-C — получить компонент NSDate месяца в word против int?

#ios #objective-c

#iOS #objective-c

Вопрос:

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

  "<NSDateComponents: 0x282564be0> {n    Calendar Year: 2020n    Month: 10n    Leap Month: 0n    Day: 1",
    "<NSDateComponents: 0x282561120> {n    Calendar Year: 2020n    Month: 10n    Leap Month: 0n    Day: 2",
    "<NSDateComponents: 0x282561180> {n    Calendar Year: 2020n    Month: 10n    Leap Month: 0n    Day: 3",
    "<NSDateComponents: 0x2825611a0> {n    Calendar Year: 2020n    Month: 10n    Leap Month: 0n    Day: 4",
    "<NSDateComponents: 0x282564bd0> {n    Calendar Year: 2020n    Month: 10n    Leap Month: 0n    Day: 5",
    "<NSDateComponents: 0x282561310> {n    Calendar Year: 2020n    Month: 10n    Leap Month: 0n    Day: 6",
    "<NSDateComponents: 0x282561530> {n    Calendar Year: 2020n    Month: 10n    Leap Month: 0n    Day: 7"
  

Возможно ли вернуть объект ‘month’ в виде трехбуквенного месяца вместо фактического номера месяца? Например. вернуть октябрь как «Октябрь» вместо 10? Я могу поместить dateformatter в даты, возвращаемые в мой массив, но я не уверен, как я могу применить это к компонентам?

ViewController.m

        NSDate *today = [NSDate date];
       NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
       NSCalendar *calendar = [NSCalendar currentCalendar];
   
       dateFormatter.dateFormat = @"ddMMM";
       for (UInt16 i = 0; i < 7; i  ) {
         
           NSDate *nextDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:i toDate:today options: 0];
       
           [_weekdates addObject:[dateFormatter stringFromDate: nextDate]];
           
           NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:nextDate]; // Get necessary date components
           
           [components month];

           NSLog(@"%@", components); 

}
  

Ответ №1:

[dateFormatter shortMonthSymbols] это возвращает массив коротких месяцев, например Jan,Feb,Mar.... , используя это, вы получаете три буквы месяца.

 NSLog(@"%@", [dateFormatter shortMonthSymbols][components.month-1]);
  

[components.month] возвращает номер месяца от 1 до 12.

 - (NSString *)getMonthFromDate:(NSDate *)date {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    NSDateComponents* components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:date];
    NSString *strMonthName = [dateFormatter shortMonthSymbols][components.month-1];
    NSLog(@"%@", strMonthName);
    return strMonthName;
}
  

Ответ №2:

Простой массив со значениями месяца и доступ к нему по номеру месяца будет работать.

 months = [NSArray arrayWithObjects: @"Jan", @"Feb", nil];  
[months objectAtIndex: i]=> i=0=> "Jan"
  

Комментарии:

1. Это на самом деле то, что я делаю в настоящее время; просто подумал, что может быть более эффективный способ вернуть компоненты, уже отформатированные как таковые :/