IOS: переход между 12/24 часами из строк

Интересная проблема, которая меня поймала.

Я получаю строки с сервера на устройство. который затем конвертируется в NSDate. Когда устройство было настроено на отображение 24 часов, жизнь была хорошей.

Теперь я тестирую его на устройстве, установленном на 12 часов. все перестало работать. Даты возвращаются как null

Сначала я имел

 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
 [dateFormat setDateFormat:@"HH:mm"];
 self.startTime = [dateFormat dateFromString:(NSString *)self.startTime];

Отлично работает для устройств, показывающих 24 часа, но не 12 часов.

Затем я попробовал

 NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
 [dateFormat setDateFormat:@"HH:mm"];
 self.startTime = [dateFormat dateFromString:(NSString *)self.startTime];

Это работает до 12 часов, затем все даты возвращаются как null

Обновление

Я также попытался добавить "a", но это все равно приводит к возврату null

 if (startDate == nil)
 {
      NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
      [dateFormat setDateFormat:@"hh:mm a"];
      startDate = [dateFormat dateFromString:(NSString *)self.startTime];
 }

Обновление 2

Добавление локального, добавление: ss добавление все еще не работает

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
NSLocale *twelveHourLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormat.locale = twelveHourLocale;
[dateFormat setDateFormat:@"hh:mm a"];
startDate = [dateFormat dateFromString:(NSString *)self.startTime];

Ответы

Ответ 1

Это близко... Думаю, вам нужно:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[dateFormatter setLocale:locale];
[dateFormatter setDateFormat:@"HH:mm"];
startDate = [dateFormatter dateFromString:(NSString *)self.startTime];

Ответ 2

Вы можете попробовать это

    12 to 24 hour format


    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    [df setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [df setTimeZone:[NSTimeZone systemTimeZone]];
    [df setDateFormat:@"hh:mm a"];
    NSDate* newDate = [df dateFromString:LocationTrackingStartTime];
    [df setDateFormat:@"HH:mm"];
    newDate = [df stringFromDate:newDate];

   24 to 12 hour format

    NSDateFormatter* df = [[NSDateFormatter alloc] init];
    [df setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [df setTimeZone:[NSTimeZone systemTimeZone]];
    [df setDateFormat:@"yyyy-mm-dd hh:mm:ss"];
    NSDate* newDate = [df dateFromString:[df stringFromDate:[NSDate date]]];
    [df setDateFormat:@"hh:mm a"];
    newDate = [df stringFromDate:[NSDate date]];

Ответ 3

Вам нужно добавить am/pm:

NSLocale *twelveHourLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormat.locale = twelveHourLocale;
[dateFormat setDateFormat:@"hh:mm: a"];

Ответ 4

Изменение формата 24 часа до 12-часового формата,

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    //Set 24 hours date format
    dateFormatter.dateFormat = @"HH:mm";

    //Here @"your24hours date string" is your string date with 24 hours format
    NSDate *date = [dateFormatter dateFromString:@"your24hours date string"];

    //Set 12 hours date format
    dateFormatter.dateFormat = @"hh:mm a";
    NSString *strDate = [dateFormatter stringFromDate:date];

    NSLog (@"%@", strDate);

   //Output is in 12 hours date format.

Ответ 5

Вы хотите снова преобразовать NSDate в значение NSString в NSDate. Сначала вам нужно преобразовать его и NSString, а не принуждать его!

Я также поддерживаю 12 и 24-часовые форматы, и у меня нет проблем с ним.

Ответ 6

NSDateFormatter* df = [[NSDateFormatter alloc]init];

[df setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
[df setTimeZone:[NSTimeZone systemTimeZone]];    
[df setDateFormat:@"MM/dd/yyyy hh:mm a"];

NSDate* newDate = [df dateFromString:strDate4Convert];    
[df setDateFormat:@"MM/dd/yyyy HH:mm:ss"];    
 NSString *newTimeStr = [df stringFromDate:newDate];

Ответ 7

   You just need to set the locale to take the am pm format. And everything else as usual.

    NSDateFormatter * df = [[NSDateFormatter alloc]init];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]; 
    [df setLocale:locale];
    [df setDateStyle:NSDateFormatterNoStyle];
    [df setTimeStyle:NSDateFormatterShortStyle];
    NSLog(@"%@", [df stringFromDate:pickUpDate]);