#ios #cocoa #nsdate #nsdateformatter
#iOS #какао #nsdate #nsdateformatter
Вопрос:
Мне нужно преобразовать дату из этого формата: «2011-11-04T18:30:49Z»
В этот формат: «ММ / дд / гг чч: мм: SS a»
С добавлением смещения системы пользователя currentGMTOffset, извлеченного с помощью:
NSTimeZone* currentTimeZone = [NSTimeZone localTimeZone];
NSInteger currentGMTOffset = [currentTimeZone secondsFromGMT];
Любая помощь будет высоко оценена.
Спасибо!
Ответ №1:
Этот фрагмент поможет вам преобразовать форматированную строку в NSDate.
// Current date.
NSString *currentDate = @"2011-11-04T18:30:49Z";
// NSDateFormatter stuff.
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
[dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
// Convert to NSDate.
NSDate *neededDate = [dateFormatter dateFromString:currentDate];
Затем вам просто нужно преобразовать в требуемый формат.
Я использую ARC, поэтому управление памятью не требуется.
Комментарии:
1. Хорошо, но это создает дату с часовым поясом 0, что нормально, поскольку исходная дата смещена на 0. Но мне нужно, чтобы дата была с региональным смещением пользователя, таким как 5 или, может быть, -1, в зависимости от пользователя. Вы дали мне половину требуемого ответа 🙂 спасибо, чувак.
2. Спасибо, мне в основном нужно было узнать время, прошедшее с момента получения с сервера, я просто получил текущее системное время и просто использовал интервал NSTimeInterval = [currentDate timeIntervalSinceDate:neededDate]
Ответ №2:
Взгляните на NSDateFormatter. Вам нужно будет настроить формат даты и часовой пояс в объекте форматирования даты, а затем вы сможете конвертировать строки в даты и даты в строки.
Комментарии:
1. Я пытался сделать это в течение последних двух часов: (
2. ОК. Итак, что вас беспокоит? Строки формата? Ознакомьтесь с этой ссылкой, чтобы узнать, какие коды использовать ( unicode.org/reports/tr35/tr35-10.html#Date_Format_Patterns ). Вы захотите настроить форматировщик даты с исходным форматом, который вы используете для преобразования в NSDate, а затем второй форматировщик с другим форматом, который преобразует NSDate в нужную вам строку.
3. Это то, что я понял: NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@»ГГГГ-ММ-DDTHH: мм: ss Z»]; NSDate *createdAtDate = [df dateFromString:createdAtString]; Где createdAtString: «2011-11-04T18 :30:49Z» Но это дает CreatedDate значение null
Ответ №3:
(NSString *)userVisibleDateTimeStringForRFC3339DateTimeString:(NSString *)rfc3339DateTimeString {
/*
Returns a user-visible date time string that corresponds to the specified
RFC 3339 date time string. Note that this does not handle all possible
RFC 3339 date time strings, just one of the most common styles.
*/
NSDateFormatter *rfc3339DateFormatter = [[NSDateFormatter alloc] init];
NSLocale *enUSPOSIXLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
[rfc3339DateFormatter setLocale:enUSPOSIXLocale];
[rfc3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
[rfc3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
// Convert the RFC 3339 date time string to an NSDate.
NSDate *date = [rfc3339DateFormatter dateFromString:rfc3339DateTimeString];
NSString *userVisibleDateTimeString;
if (date != nil) {
// Convert the date object to a user-visible date string.
NSDateFormatter *userVisibleDateFormatter = [[NSDateFormatter alloc] init];
assert(userVisibleDateFormatter != nil);
[userVisibleDateFormatter setDateStyle:NSDateFormatterShortStyle];
[userVisibleDateFormatter setTimeStyle:NSDateFormatterShortStyle];
userVisibleDateTimeString = [userVisibleDateFormatter stringFromDate:date];
}
return userVisibleDateTimeString;
}
Это может помочь.