timedelta — преобразование C ++ «HH: MM: SS.fraction» до int64_t

Существует ли распространенный, удобный, кроссплатформенный метод для преобразования строки формата «ЧЧ: ММ: СС.<доля секунды>»к (timedelta) числовому типу и наоборот в C или C ++?

0

Решение

strptime является настолько портативным, насколько это возможно для этой конкретной проблемы. Его нет в стандартной библиотеке C (даже если он был добавлен после того, как C89, C99 и C2011 не более переносимы, чем POSIX (большое спасибо, Microsoft)), но он достаточно распространен, поэтому я рекомендую писать ваш код так, как если бы он был универсальным, а затем обнаружил его отсутствие в вашей системе сборки и вставил замену. Вы можете получить лицензию BSD здесь: http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD (может потребоваться настройка мобильности)

1

Другие решения

Это не ужасно сложно (я предполагаю, что ваше время сгенерировано машиной, а не написано от руки, поэтому мы можем полагаться на то, что оно «правильное» — в противном случае нам пришлось бы добавить загрузку «это значение в диапазоне») чеки). Я также собираюсь предположить, что дробь всегда одинаковое количество цифр.

int64_t parsetime(char *str)
{
int hh, mm, ss, fract;
int64_t t;

if (sscanf(str, "%d:%d:%d.%d", &hh, &mm, &ss, &fract) != 4)
{
printf("Badly formed time %s\n", str);
return -1;
}

// 1000000 assumes there are 6 digits in fract, and we want microseconds.
t = ((hh * 60)  + mm *60) + s) * 1000000 + fract;

return t;
}

Вы можете сделать что-то подобное, используя double а также %d:%d:%lf для строки формата, затем умножьте на соответствующий множитель, чтобы получить дроби в целочисленной форме (например, 1000 для миллисекунд, 1000000 для микро, 100000000 для наносекунд и т. д.)

1

По вопросам рекламы [email protected]