C ++转换" HH:MM:SS.fraction"到int64_t

时间:2012-12-24 18:25:07

标签: c++ timedelta

是否有一种通用,方便,跨平台的方法来转换格式字符串“HH:MM:SS。<一秒的分数>”在C或C ++中用于(timedelta)数值类型,反之亦然?

2 个答案:

答案 0 :(得分:1)

strptime与此特定问题一样便携。它不在C标准库中(即使它已被添加,因为C89,C99和C2011不再比POSIX便携(非常感谢,微软))但它足够广泛,我的建议是编写你的代码就好像它是通用的,然后检测它在你的构建系统中的缺席并注入一个替代品。您可以在此处获得BSD许可的替换:http://cvsweb.netbsd.org/bsdweb.cgi/src/lib/libc/time/strptime.c?rev=HEAD(可能需要可移植性调整)

答案 1 :(得分: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纳秒等)