0

在 C 或 C++ 中,是否有一种通用、方便、跨平台的方法可以将格式为“HH:MM:SS.<fraction of a second>”的字符串转换为(timedelta)数字类型,反之亦然?

4

2 回答 2

2

这并不难(我假设你的时间是机器生成的,而不是手写的,所以我们可以依赖它是“正确的” - 否则,我们必须添加“这个值在范围内”的负载检查)。我还将假设分数始终是相同的位数。

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纳秒等)

于 2012-12-24T19:18:18.013 回答
1

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

于 2012-12-24T18:36:29.647 回答