NSDateFormatter с 24 часами

У меня есть таймер обратного отсчета, который отсчет времени от текущей даты / времени до конкретной будущей даты / времени. Он отлично работает, за исключением одной проблемы. Я ввожу будущую дату, используя NSDateFormatter и dateFromString. Кажется, он не может принять какое-либо время (час) более 12, хотя указывает на то, что он не поддерживает 24-часовые часы. Есть ли способ включить круглосуточную поддержку или временное решение? Вот некоторые из моих кодов:

NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"yyyy-MM-dd hh:mm:ss"]; NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"]; 

благодаря

NSDateFormatter следует стандарту Unicode для шаблонов даты и времени . Используйте «H» в течение часа на 24-часовом часе:

 NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate *myDate = [df dateFromString:@"2010-03-14 15:00:00"]; 

У меня была такая же проблема, и использование HH работало только на некоторых устройствах, таких как Роджер также проверял. В конце концов это было решение, которое сработало для меня, я надеюсь, что это работает для других. Нахождение этого ответа было затруднительным, с ним не было форумов, это было буквально пробным и ошибочным после документации Apple.

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; [dateFormatter setLocale:enUSPOSIXLocale]; NSString *dateFormat = @"dd/MM/yyyy HH:mm"; //MM for month, mm for minutes [dateFormatter setDateFormat:dateFormat]; [dateFormatter setTimeZone:[NSTimeZone localTimeZone]]; date = [dateFormatter dateFromString:string]; 

Мое решение на Swift:

 let formatter = NSDateFormatter() var defIdentifer = formatter.locale.localeIdentifier if !defIdentifer.hasSuffix("_POSIX") { defIdentifer = defIdentifer+"_POSIX" let locale = NSLocale(localeIdentifier: defIdentifer) formatter.locale = locale } formatter.dateFormat = "HH:mm" 

Взято из Технических вопросов и ответов Apple на NSDateFormatters

В: Я использую NSDateFormatter для синтаксического анализа даты в интернет-стиле, но это не удается для некоторых пользователей в некоторых регионах. Я установил конкретную строку формата даты; не следует ли заставить NSDateFormatter работать независимо от настроек региона пользователя?

A: Нет. При настройке строки формата даты, как представляется, будет работать для большинства пользователей, это неправильное решение этой проблемы. Есть много мест, где строки формата ведут себя неожиданным образом.

Вот как я сделал мое в Свифте:

 private let dateFormatter: NSDateFormatter = { let dateFormatter = NSDateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") dateFormatter.timeZone = NSTimeZone.init(forSecondsFromGMT: 0) return dateFormatter }() 

Недавно у меня была аналогичная проблема, вместо HH NSDateFormatter проигнорировал hh , (AM / PM Symbol) и G (название циклической эры) в моем приложении.

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

Затем я протестировал на симуляторе, чтобы провести некоторое исследование. Есть мое решение:

После создания NSDateFormatter явным образом устанавливаю свойство locale, даже если вы используете текущую локаль, что более важно, НЕ используйте [NSLocale currentLocale] , этот прослушивается и может быть каким-то образом «перенаправлен» с помощью пользовательских настроек, использовать systemLocale или явно создавать экземпляр NSLocale с использованием NSLocale локали.

Objective C версия получения NSDate из 24-часовой строки, когда пользователь установил 12-часовой формат на своем iPhone без изменения языка и настройки часового пояса:

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; NSString *localeId = dateFormatter.locale.localeIdentifier; if (! [localeId hasSuffix:@"_POSIX"]) { localeId = [localeId stringByAppendingString:@"_POSIX"]; dateFormatter.locale = [NSLocale localeWithLocaleIdentifier:localeId]; } dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH.mm.ss"; NSDate *date = [dateFormatter dateFromString:dateText]; 
  • Переменная Property vs. instance
  • Создание пользовательского UIKeyBoard для iPhone
  • Пользовательские цвета в UITabBar
  • UIPopoverPresentationController на iOS 8 iPhone
  • Как распечатать имя метода и номер строки и условно отключить NSLog?
  • Как использовать NSTimer?
  • Как запустить UITableView на последней ячейке?
  • Очереди отправки: как узнать, запущены ли они и как их остановить
  • Как я могу получить объект NSDate на сегодня в полночь?
  • Ошибка Apple Mach-O Linker при компиляции для устройства
  • UIImage для base64 Кодирование строк
  • Давайте будем гением компьютера.