Розбір рядка дійсно є єдиним шляхом. Однак є багато способів зробити це.
Моїм кращим методом є спочатку перевірити правильність формату, звернувши увагу на те, що T і Z знаходяться в потрібному місці:
if (timeString[8] == 'T' && timeString[15] == 'Z') {
... parse in here
}
І синтаксичний аналіз просто робить числа з множенням:
int year = (timeString[0] - '0') * 1000 +
(timeString[1] - '0') * 100 +
(timeString[2] - '0') * 10 +
(timeString[3] - '0');
Можна очистити макроси, якщо хочете:
#define NUM(off, mult) ((timeString[(off)] - '0') * (mult))
Потім:
int year = NUM(0, 1000) + NUM(1, 100) + NUM(2, 10) + NUM(3, 1);
int month = NUM(4, 10) + NUM(5, 1);
int day = NUM(6, 10) + NUM(7, 1);
int hour = NUM(9, 10) + NUM(10, 1);
int minute = NUM(11, 10) + NUM(12, 1);
int second = NUM(13, 10) + NUM(14, 1);
А потім, так, помістіть їх у struct tm
(або безпосередньо призначте їх результати розрахунків без використання проміжних змінних) і зателефонуйте mktime()
.