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