Убедитесь, что AM/PM (Period) не отображается в NSDateFormat stringFromDate

В руководстве по шаблонам формата даты Unicode ( здесь ) указано, что добавление 'a' к формат получит период (например, AM или PM), например,

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss a"];

Однако я хочу убедиться, что информация о периоде не отображается, но я не могу найти строку формата для этого. Используемая строка формата выглядит следующим образом:

[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];

к сожалению, когда я использую stringFromDate, я получаю следующее:

2013-01-09T11: 11: 00 AM

Я не хочу просто удалять AM или PM из результирующей строки, потому что синтаксис периода может отличаться в разных календарях и т. Д., Я просто хочу остановить появление информации о периоде.

----8<------

Рассмотрим следующий код

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
NSString *stringDate = [formatter stringFromDate:[NSDate date]];

self.labelOutput.text = stringDate;

[formatter release];

Этот код создаст строку в формате, который я хочу, но я не могу использовать его для управления памятью. Приложение, над которым я работаю, страдает от утечек памяти NSDateFormatter. Поэтому мы используем класс singleton для предоставления установленного номера NSDateFormatters для приложения, которое никогда не выпускается, и поэтому мы минимизируем количество утечек памяти. К сожалению, эти статические NSDateFormatters добавляют AM/PM, даже когда я применяю строку формата даты, таким образом:

NSDateFormatter *formatter = [MyDateFormatter dateFormat:kFormatDateMediumStyleTimeShortStyle];

[formatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
[formatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
8
Стоит показать подкласс MyDateFormatter. iE неправильно переписывает setDateFormat: и аналогичные методы?
добавлено автор vikingosegundo, источник
Нечетко, не возражаете ли вы опубликовать весь метод, где это происходит, или более уместный фрагмент, если тело метода слишком велико?
добавлено автор Anurag Kapur, источник

5 ответы

Согласно формат даты, отличающийся от другого устройства, работающие на той же версии iOS , установите локальный код NSDateFormatter на en_US_POSIX , чтобы исправить это.

Дополнительно для установки Local вы можете избежать проблем с настройкой часового пояса, например:
[formatter setTimeZone: [NSTimeZone timeZoneWithAbbreviation: @ "UTC"]];

5
добавлено

Фактически это зависит от настроек пользователя.

См. Fixed Formats в Руководстве по форматированию данных. Обратите внимание на это предложение:

В iOS пользователь может переопределить по умолчанию AM/PM по сравнению с 24-часовым временем   установка. Это может привести к тому, что NSDateFormatter перепишет строку формата   вы установили.

И в конце абзаца:

Представление времени может быть 13:00. Однако в iOS , если   пользователь переключил 24-часовое время на выключение , время может быть 1:00 вечера.

2
добавлено
отметил, спасибо: Однако это не объясняет два сценария, которые я только что выделил выше. Пользовательские настройки не были изменены, но не указаны AM/PM; один не
добавлено автор Damo, источник

Вы должны использовать POSIX здесь пример кода

  NSDateFormatter *rfc3339DateFormatter = [[NSDateFormatter alloc] init];
      NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

      [rfc3339DateFormatter setLocale:enUSPOSIXLocale];
      [rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
      [rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];

     //Convert the RFC 3339 date time string to an NSDate.
      NSDate *date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString];
1
добавлено

Один из вариантов - создать собственный NSFormatter. Я сделал это в своем коде, когда не смог получить форматирование в Interface Builder Xcode, чтобы делать то, что я хотел. Конечно, я искал только часы, минуты и секунды, а не полную дату.

Что касается утечек памяти: если можно, используйте ARC. Если вы не можете, используйте статический анализатор Xcode, чтобы попытаться отследить неправильное количество задержек.

0
добавлено

Вот ответ, на который я остановился. Это немного упрощенно, но это делает работу.

@interface NSDateFormatter (Utils)

- (NSString *)stringWithNoPeriodInformationFromDate:(NSDate*)date;

@end

@implementation NSDateFormatter (Utils)

- (NSString *)stringWithNoPeriodInformationFromDate:(NSDate*)date
{
    NSString *stringWithPotentialPeriodInformation = [self stringFromDate:date];
    NSString *stringWithNoAMInformation = [stringWithPotentialPeriodInformation stringByReplacingOccurrencesOfString:[self AMSymbol] withString:@""];
    NSString *stringWithNoPeriodInformation = [stringWithNoAMInformation stringByReplacingOccurrencesOfString:[self PMSymbol] withString:@""];

    return stringWithNoPeriodInformation;
}

@end
0
добавлено
верна ли дата? Я не думаю, что это просто удаление AM/PM с даты.
добавлено автор Toseef Khilji, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.