Формат даты RFC3339
Я получаю следующую дату в формате строки из API
2015-04-18 06:08:28.000000
Я хочу, чтобы дата была в формате d/M/yyyy
Я попробовал следующее
NSString *datevalue = (NSString*)value;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"d/M/yyyy"];
NSDate *date = [formatter dateFromString:datevalue];
NSString *currentDate = [formatter stringFromDate:date];
Это возвращает NIL, в чем может быть возможная проблема, или как мне отформатировать такие даты в targe t-c?
Благодарю.
3 ответа
Вы должны использовать yyyy-MM-dd HH:mm:ss.SSSSSSS
строка формата для форматера даты, преобразующего дату API в NSDate
объект, как обсуждали другие. Но вы также хотите рассмотреть timeZone
а также locale
свойства этого форматера.
Обычно даты RFC 3339 обмениваются в GMT. Подтвердите это своим API, но обычно это GMT/UTC/Zulu. Если это так, вы, вероятно, также захотите явно установить часовой пояс:
formatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
Но подтвердите, какой часовой пояс ожидает API.
Более тонкая проблема - обработка пользователей с негригорианскими календарями.
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
Для получения дополнительной информации см. Технический вопрос и ответ Apple 1480.
Понятно, что эти dateFormat
, timeZone
, а также locale
свойства просто для преобразования строки даты API в NSDate
объект. Когда вы выводите дату для конечного пользователя, вы должны использовать отдельный форматер, по умолчанию стандартный timeZone
а также locale
свойства и использовать что угодно dateFormat
Строка, которую вы хотите для вывода. (Честно говоря, я бы вообще не советовал использовать dateFormat
строка для пользовательских форматеров вывода, а просто используйте соответствующие значения для dateStyle
а также timeStyle
Свойства).
Вы не можете использовать один и тот же форматер для чтения и записи строки даты, потому что они разные. Формат введенной вами даты неверен.
// input string date: 2015-04-18 06:08:28.000000
// [formatter setDateFormat:@"d/M/yyyy"]; // incorrect
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"];
Ниже приведен пример кода
//
// main.m
// so29732496
//
// Created on 4/19/15.
//
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"Hello, World!");
NSString *dateStringFromAPI = @"2015-04-18 06:08:28.000000";
NSString * const kAPIDateFormat = @"yyyy-MM-dd HH:mm:ss.SSSSSS";
// convert API date string
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:kAPIDateFormat];
NSDate *apiDate = [formatter dateFromString:dateStringFromAPI];
// now if I was output the api date to another format
// I have to change the formatter
[formatter setDateFormat:@"dd/M/yyyy"];
NSString *currentDate = [formatter stringFromDate:apiDate];
NSLog(@"Current Date: %@", currentDate);
}
return 0;
}
Просто хочу добавить к ответу Black Frog: как он сказал, вам нужны разные форматеры для чтения / записи.
Однако правильный формат должен быть:
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"];
Согласно документации Apple, доли секунды должны быть отформатированы как 'S'.
Смотрите здесь: NSDateFormat
Также вот пример для выполнения вашей задачи:
NSString *datevalue = @"2015-04-18 06:08:28.000000";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss.SSSSSS"];
NSDate *date = [formatter dateFromString:datevalue];
[formatter setDateFormat:@"dd/MM/yyyy"];
NSString *currentDate = [formatter stringFromDate:date];
NSLog(@"%@",date);
NSLog(@"%@",currentDate);