如何实现FileTimeToSystemTime?

时间:2010-06-16 06:04:04

标签: c++ datetime

我正在围绕Win32 FILETIME结构编写一个简单的包装器。 boost::datetime具有我想要的大部分内容,除了我需要的任何日期类型,我最终使用Windows API进行插值而没有问题。

为此,我决定为此做自己的事情 - 大部分操作都不是那么复杂。我现在正在实现类似TimeSpan的类型,但我不确定如何实现FileTimeToSystemTime。我可以使用系统的内置FileTimeToSystemTime函数,但FileTimeToSystemTime无法处理负数日期 - 我需要能够表示类似“-12秒”的内容。

应该如何实施这样的事情?

Billy3

3 个答案:

答案 0 :(得分:2)

Windows SYSTEMTIME和FILETIME数据类型旨在表示特定的日期和时间。它们并不适合代表时差。时间差最好是表示两个SYSTEMTIME或FILETIME之间的数字的简单整数。如果您需要更高的精度,可能是秒,或者更小的东西。

如果需要向用户显示差异,可以使用简单除法和模数来计算组件。

std::string PrintTimeDiff(int nSecDiff)
{
    std::ostringstream os;

    if (nSecDiff<0)
    {
        os << "-";
        nSecDiff= -nSecDiff;
    }
    int nSeconds = nSecDiff % (24*60*60);
    nSecDiff /= 60;
    int nMinutes = nSecDiff % (24*60)
    nSecDiff /= 60;
    int nHours = nSecDiff % 24;
    int nDays = nSecDiff / 24;

    os << nDays << " Days " << nHours << ":" << nMinutes << ":" << nSeconds;
    return os .str();
}

答案 1 :(得分:1)

假设你所有的结构都没有问题,你可以采取任何负面的时间跨度,使它们为正,调用FileTimeToSystemTime,然后(如果原始输入为负)挑出组件使其成为负数。

答案 2 :(得分:0)

我在这看到糟糕的设计。在使用系统时间和文件时间测量时,时间跨度,两次之间的差异是相同的。 W32 FileTimeToSystemTime关于不接受负值是正确的,因为它没有任何意义。无论您使用哪个时区,2秒的时间段都是2秒的时间段。

//编辑: 第二个问题。 SYSTEMTIME能够以某种方式表示时间跨度,但这将是错误的。即测量时间跨度时,月份不可用。