Как отформатировать дату SQLite в iPhone? - PullRequest
1 голос
/ 10 мая 2010

Я знаю, что SQLite не поддерживает название дня и месяца. Я прошел этот вопрос. Я создал две пользовательские функции для этого.

Моя пользовательская функция для преобразования названия дня из номера дня:

( %w day of week 0-6 with sunday==0 )

Код:

+(NSString*)dayNameStringFromDayNo:(NSString*)dayNo{
    return 
    ([dayNo isEqualToString:@"0"])?@"Sunday":
    ( ([dayNo isEqualToString:@"1"])?@"Monday":
     ( ([dayNo isEqualToString:@"2"])?@"Tuesday":
      ( ([dayNo isEqualToString:@"3"])?@"Wednesday":
       ( ([dayNo isEqualToString:@"4"])?@"Thursday":
        ( ([dayNo isEqualToString:@"5"])?@"Friday": @"Saturday"
        )
       )
      )
     )
    );
}

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

( %m month: 01-12 )

Код:

+(NSString*)monthNameFromNumber:(NSString*)no{
    return ([no isEqualToString:@"01"])?@"January":
    ( ([no isEqualToString:@"02"])?@"February":
     ( ([no isEqualToString:@"03"])?@"March":
      ( ([no isEqualToString:@"04"])?@"April":
       ( ([no isEqualToString:@"05"])?@"May":
        ( ([no isEqualToString:@"06"])?@"June":
         ( ([no isEqualToString:@"07"])?@"July":
          ( ([no isEqualToString:@"08"])?@"August":
           ( ([no isEqualToString:@"09"])?@"September":
            ( ([no isEqualToString:@"10"])?@"October":
             ( ([no isEqualToString:@"11"])?@"November":@"Decemeber"
             )
            )
           )              
          )
         )
        )
       )
      )
     )
    );
}

А как насчет даты следующего формата

Sat 6th February

Как получить такой вывод? Должен ли я снова создать для него пользовательскую функцию?

Ответы [ 3 ]

3 голосов
/ 10 мая 2010

Какой формат даты вы получаете от SQLite? SQLite не имеет собственного типа данных даты / времени, но обычно дата хранится в виде строки ISO8601 в форме YYYY-MM-DD HH:MM:SS или метки времени в стиле Unix.

Шаг 1: Получить дату как NSDate. Вот один из способов, используя формат ISO8601, упомянутый выше:

// Create a date formatter
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
[inputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

// Use the formatter to convert the string you retrieved (from
// SQLite) into an NSDate.
NSDate *theDate = [inputFormatter dateFromString:yourSQLiteString];

// Don't forget to release alloc'ed resources
[inputFormatter release];

Если ваша дата была сохранена как временная метка в стиле Unix, вы можете пропустить, используя форматировщик ввода и использовать NSDate dateWithTimeIntervalSince1970:.

Шаг 2: Преобразование даты в строку:

// Create a date formatter for whatever format you want to output,
// using the formatting patterns from Unicode tr35-6 Appendix F.
outputFormatter = [[NSDateFormatter alloc] init];
[outputFormatter setDateFormat:@"EEE d MMMM"];
NSString *dateString = [dateFormatter stringFromDate:theDate];

// Don't forget to release alloc'ed resources.
[outputFormatter release];

В этом примере вы получите строку типа Sat 6 February, предполагая, что пользователь находится в английском языке.

Ссылки:

1 голос
/ 10 мая 2010

Почему бы не использовать возможности форматирования клиентского кода, или ojective-c не включает strftime?

0 голосов
/ 10 мая 2010

OK. Я наконец добавил несколько пользовательских методов для этого.

+(NSString*)dayNameStringFromDayNo:(NSString*)dayNo{
    return 
    ([dayNo isEqualToString:@"0"])?@"Sunday":
    ( ([dayNo isEqualToString:@"1"])?@"Monday":
     ( ([dayNo isEqualToString:@"2"])?@"Tuesday":
      ( ([dayNo isEqualToString:@"3"])?@"Wednesday":
       ( ([dayNo isEqualToString:@"4"])?@"Thursday":
        ( ([dayNo isEqualToString:@"5"])?@"Friday": @"Saturday"
         )
        )
       )
      )
     );
}

+(NSString*)dayNameHalfStringFromDayNo:(NSString*)dayNo{
    return 
    ([dayNo isEqualToString:@"0"])?@"Sun":
    ( ([dayNo isEqualToString:@"1"])?@"Mon":
     ( ([dayNo isEqualToString:@"2"])?@"Tues":
      ( ([dayNo isEqualToString:@"3"])?@"Wed":
       ( ([dayNo isEqualToString:@"4"])?@"Thu":
        ( ([dayNo isEqualToString:@"5"])?@"Fri": @"Sat"
         )
        )
       )
      )
     );
}

+(NSString*)monthNameFromNumber:(NSString*)no{
    return ([no isEqualToString:@"01"])?@"January":
    ( ([no isEqualToString:@"02"])?@"February":
     ( ([no isEqualToString:@"03"])?@"March":
      ( ([no isEqualToString:@"04"])?@"April":
       ( ([no isEqualToString:@"05"])?@"May":
        ( ([no isEqualToString:@"06"])?@"June":
         ( ([no isEqualToString:@"07"])?@"July":
          ( ([no isEqualToString:@"08"])?@"August":
           ( ([no isEqualToString:@"09"])?@"September":
            ( ([no isEqualToString:@"10"])?@"October":
             ( ([no isEqualToString:@"11"])?@"November":@"Decemeber"
              )
             )
            )              
           )
          )
         )
        )
       )
      )
     );
}


+(NSString*)monthNameHalfFromNumber:(NSString*)no{
    return ([no isEqualToString:@"01"])?@"Jan":
    ( ([no isEqualToString:@"02"])?@"Feb":
     ( ([no isEqualToString:@"03"])?@"Mar":
      ( ([no isEqualToString:@"04"])?@"Apr":
       ( ([no isEqualToString:@"05"])?@"May":
        ( ([no isEqualToString:@"06"])?@"Jun":
         ( ([no isEqualToString:@"07"])?@"Jul":
          ( ([no isEqualToString:@"08"])?@"Aug":
           ( ([no isEqualToString:@"09"])?@"Sep":
            ( ([no isEqualToString:@"10"])?@"Oct":
             ( ([no isEqualToString:@"11"])?@"Nov":@"Dec"
              )
             )
            )              
           )
          )
         )
        )
       )
      )
     );
}

+(NSString*)suffixNameForNumber:(NSString*)no{
    NSInteger noV=[no intValue];
    if(noV>=11 && noV<=20){
        return [no stringByAppendingString:@"th"];
    } else {
        NSString *l=[no substringFromIndex:1];
        if([l isEqualToString:@"1"]){
            return [no stringByAppendingString:@"st"];
        } else if([l isEqualToString:@"2"]){
            return [no stringByAppendingString:@"nd"];
        } else if([l isEqualToString:@"3"]){
            return [no stringByAppendingString:@"rd"];
        } else {
            return [no stringByAppendingString:@"th"];
        }
    }   
}
...