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"];
благодаря
- Класс размера для iPad-портрета и ландшафтных режимов
- Ошибка UICollectionView Assertion
- Ссылка с UITableViewCell на родительский UITableView?
- как увеличить размер шрифта в UIWebView
- Есть ли документальный способ настройки ориентации iPhone?
- Использование iPhone - dequeueReusableCellWithIdentifier
- Точка с запятой после имени метода в файле реализации Objective-C
- UISlider вместе с ProgressView
- UIButton внутри представления с UITapGestureRecognizer
- Как настроить размер содержимого UIScrollView динамически
- Как я могу получить точное время, например, в миллисекундах в Objective-C?
- Сортировка NSArray строк или объектов даты
- используя objc_msgSend для вызова функции Objective C с именованными аргументами
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];