Формат даты 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);
Другие вопросы по тегам