Какой метод класса Какао форматирует данные [NSDate date] в текстовую строку ключа сортируемой последовательности? - PullRequest
0 голосов
/ 04 июня 2018

Мне нужна была отметка даты, которая была бы пригодна для включения в ключ последовательности в качестве аргумента для сортировки текстового файла с датированными записями.Я изучил документацию Apple и искал в Интернете и не смог найти ссылку, которая действительно отвечала бы моим критериям: строка, отформатированная как

ГГГГ-ММ-ДД ЧЧ: ММ: СС GMT

с часами, выраженными в 24-часовом (военном) формате.Поэтому мне пришлось кодировать мой собственный метод форматирования меток даты, как показано на рисунке.

Встроенные комментарии помогли в точках останова при отладке сложного кода C, используемого для его низких издержек.Эти комментарии включают строку datetime, созданную [dateFormatter stringFromDate:date], и представление о разработке нужного формата отметки даты.Комментарии с кареткой ^ указывают на текущую позицию индекса сканирования.

NSMutableString * sortableMilitaryDateTimeStamp()
{
    NSString * datetime;
    NSDate   * date;
    NSMutableString * sortableDate;
    int  d, sln, s, hr, x;
    char c;
    char inpbuffer[24]; char * src = (char *) &inpbuffer;
    char dstbuffer[] = "....-..-.. ..:..:.. ...";
    char * dst = (char *) &dstbuffer;

    date = [NSDate date];
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateStyle:NSDateFormatterLongStyle];
    [dateFormatter setTimeStyle:NSDateFormatterLongStyle];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    datetime = [dateFormatter stringFromDate:date];

    sfrsTMC(src,datetime.UTF8String,24); //copies datetime text to the C string

// "June 2, 2018 at 3:04:46 PM GMT"  to become  "2018-06-02 15:04:46 GMT"
//  ^
// "....-..-.....:..:......"
    sln = strlen(src);
    d = 0;
    for (s = 0; (s <= sln) && (src[s] != ' '); s++) ;
    c = src[0];
    dst[5] = '0';
    x = src[2];
    switch (c) {
    case 'J':
        if (src[1] == 'a') dst[6] = '1';
        else
        if (x == 'l') dst[6] = '7';
        else
        if (x == 'n') dst[6] = '6';
        break;
    case 'F':
        src[6] = '2';
        break;
    case 'M':
        if (x == 'r') dst[6] = '3';
        else
        if (x == 'y') dst[6] = '5';
        break;
    case 'A':
        if (src[1] == 'p') dst[6] = '4';
        else
        if (src[1] == 'u') dst[6] = '8';
        break;
    case 'S':
       dst[6] = '9';
        break;
    case 'O':
        dst[6] = '1'; dst[6] = '0';
        break;
    case 'N':
         dst[6] = '1'; dst[6] = '1';
        break;
    case 'D':
        dst[6] = '1'; dst[6] = '2';
        break;
    }
// June 2, 2018 at 3:04:46 PM GMT  to  2018-06-02 15:04:46 GMT
//     ^
// "....-06-.. ..:..:.. ..."
    if (src[s+2] = ',') {
        dst[8] = '0';
        dst[9] = src[++s]; }
    else {
        dst[8] = src[++s];
        dst[9] = src[++s];
    }
    s += 3;
// June 2, 2018 at 3:04:46 PM GMT  to  2018-06-02 15:04:46 GMT
//         ^
// "....-06-02 ..:..:.. ..."
    d = 0;
    for (x = 0; x < 4; x++) dst[d++] = src[s++];
    s += 4;
// June 2, 2018 at 3:04:46 PM GMT  to  2018-06-02 15:04:46 GMT
//                 ^
// "2018-06-02 ..:..:.. ..."
    if (src[s+1] == ':') {
        dst[11] = '0';
        hr = src[s] - '0';
        dst[12] = src[s++]; }
    else {
        hr = src[s] - '0';
        dst[11] = src[s++];
        hr = (hr * 10) + src[s] - '0';
        dst[12] = src[s++];
    }
// "2018-06-02 03:..:.. ..."
// June 2, 2018 at 3:04:46 PM GMT  to  2018-06-02 15:04:46 GMT
//                  ^
    d = 13;
    for (x = 0; x < 7; x++) dst[d++] = src[s++];
// "2018-06-02 03:04:46 ..."
// June 2, 2018 at 3:04:46 PM GMT  to  2018-06-02 15:04:46 GMT
//                         ^
    if (src[s] == 'P') {
        hr += 12;
        dst[11] = (int) (hr / 10) + '0';
        dst[12] = (hr % 10) + '0';
    }
    s += 3;
// "2018-06-02 15:04:46 ..."
// June 2, 2018 at 3:04:46 PM GMT  to  2018-06-02 15:04:46 GMT
//                            ^
    d = 20;
    for (x = 0; x < 4; x++) dst[d++] = src[s++];
// "2018-06-02 15:04:46 GMT"

    sortableDate = @(dst).mutableCopy;
    return sortableDate;
}

Верьте или нет, это работает.Однако я не могу не думать, что сделал что-то глупое, не найдя метод, поддерживаемый каким-то собственным методом класса Какао.Я подозреваю, что должно быть что-то, что могло бы преобразовать информацию [NSDate date] напрямую.

Пожалуйста, как мне сделать что-то более подходящее?Любая конструктивная критика будет оценена.

1 Ответ

0 голосов
/ 05 июня 2018

Вот требования для вызова процедуры форматирования:

NSMutableString * sortableDate;
NSDate * date = [NSDate date];
sortableDate = makeSortableDateTimeStamp(date);

А вот процедура форматирования:

NSMutableString * makeSortableDateTimeStamp (NSDate * date)
{
    NSMutableString * datetime;
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd' 'HH':'mm':'ss' 'zzz"];
    datetime = [dateFormatter stringFromDate:date].mutableCopy;
    return datetime;
}

Кодировка для строки setDataFormat: указана в:

http://www.unicode.org/reports/tr35/tr35-25.html#Date_Format_Patterns

Существует несколько похожих unicode.org/reports, посвященных различным версиям разработки.Я выбрал этот, потому что он был указан для использования с моей версией macOS и Xcode.

Еще раз спасибо Виллеку за такой щедрый и проницательный совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...