Подтвердить что ты не робот

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"];
4b9b3361

Ответ 2

У меня была та же проблема, и использование 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];

Ответ 3

Мое решение на 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"

Ответ 4

Взято из Apple Technical Q & A в NSDateFormatters

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

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

Вот как я сделал мой в Swift:

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
}()

Ответ 5

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

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

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

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

Ответ 6

Версия 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];