Мне нужна была отметка даты, которая была бы пригодна для включения в ключ последовательности в качестве аргумента для сортировки текстового файла с датированными записями.Я изучил документацию 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]
напрямую.
Пожалуйста, как мне сделать что-то более подходящее?Любая конструктивная критика будет оценена.