NSDateFormatter с 24-часовым временем - PullRequest
42 голосов
/ 25 января 2010

У меня есть таймер обратного отсчета от текущей даты / времени до определенной будущей даты / времени. Работает отлично, за исключением одной проблемы. Я ввожу будущую дату, используя 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"];

Спасибо

Ответы [ 6 ]

65 голосов
/ 25 января 2010

NSDateFormatter соответствует стандарту Юникод для шаблонов даты и времени . Используйте '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"];
53 голосов
/ 27 декабря 2013

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

Мое решение на 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 голосов
/ 15 ноября 2016

Взято из Технических вопросов и ответов Apple на 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
}()
3 голосов
/ 21 декабря 2015

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

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

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

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

1 голос
/ 11 января 2018

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];
...