Преобразование даты NSString с 1 часовым поясом в объект NSDate с другим часовым поясом

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

«Пт, 25 марта 2011 г., 10:16:00 -07:00».

Я пытался использовать этот формат: 'aaa, dd bbb YYYY HH:MM:SS ZHHMM', но это не работает, дает мне дату в прошлом.

Мне также нужно преобразовать его в восточный часовой пояс при создании новой даты. Там написано «+0000», но к чему это нормализовано?

Любая помощь приветствуется, спасибо, ~ Араш


person iOS4Life    schedule 01.05.2011    source источник


Ответы (1)


Обычно, когда вы получаете такие строки даты, вы знаете, из какой локали они исходят, и вы должны взять NSDateFormatter, установить его локаль, используя setLocale:, установить форматирование даты и времени, используя setDateStyle: и setTimeStyle:, а затем использовать dateFromString:. Если вы не можете этого сделать, потому что не знаете языковой стандарт, вы можете используйте функции UNIX:

struct tm  sometime;
const char *formatString = "%a, %d %b %Y %T %z";
strptime_l("Fri, 25 Mar 2011 10:16:00 -0700", formatString, &sometime, NULL);
NSDate *newDate = [NSDate dateWithTimeIntervalSince1970: mktime(&sometime)];

Затем вы хотите «конвертировать» newDate в восточное время. Я говорю «преобразовать», потому что NSDates не содержит никакой информации о часовых поясах — они просто представлены в виде количества секунд с 1 января 2001 года — поэтому идея преобразования не имеет смысла. Когда вы распечатываете NSDate, вы получаете его в формате UTC (+0000), но NSDate не больше связан с этим часовым поясом, чем с любым другим.

Вместо этого вы хотите создать dateFormatter с правильным часовым поясом и использовать его для вывода даты:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"]];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
[dateFormatter setTimeStyle:NSDateFormatterShortStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSLog(@"%@",[dateFormatter stringFromDate:newDate]);
// Outputs 25 Mar 2011 13:16
person yuji    schedule 30.10.2011