首页 新闻 会员 周边

c++如何实现时间的加减操作?

0
[已解决问题] 解决于 2015-05-29 10:28

c++如何实现时间的加减操作,比如有一个时间2015-03-30 23:20:20,我想减去一个月,加上2小时,如何实现??望高手赐教,代码越简洁越好!

Patrickz10的主页 Patrickz10 | 初学一级 | 园豆:7
提问于:2015-05-19 16:13
< >
分享
最佳答案
0

我只能给一个windows平台上的方法,linux 不熟。所以 linux 平台不知道。

不过你的题目中说,减去一个月,你必须先定义什么叫做减去一个月,这里的描述有点不清楚。比如现在是3月31日,那么我问你减去一个月是几号?所以我给出的是其中一种定义的实现,就是明确的在某时刻上,可以加上或者减去n天(n=30或者31,随意)。

 

#include <windows.h>
#include <stdio.h>

BOOL AddSeconds(const LPSYSTEMTIME lpBase, LPSYSTEMTIME lpResult, int nSecs)
{
    FILETIME f1;
    ULARGE_INTEGER u1, offset, u2;

    SystemTimeToFileTime(lpBase, &f1);
    u1.LowPart = f1.dwLowDateTime;
    u1.HighPart = f1.dwHighDateTime;

    if(nSecs >= 0)
    {
        offset.QuadPart = UInt32x32To64(nSecs, 10000000);
        u2.QuadPart = u1.QuadPart + offset.QuadPart;
    }
    else
    {
        offset.QuadPart = UInt32x32To64(-nSecs, 10000000);
        u2.QuadPart = u1.QuadPart - offset.QuadPart;
    }

    f1.dwLowDateTime = u2.LowPart;
    f1.dwHighDateTime = u2.HighPart;
    return FileTimeToSystemTime(&f1, lpResult);
}


int _tmain(int argc, _TCHAR* argv[])
{
    SYSTEMTIME t[3];
    int i = -1;

    //get current time;
    GetLocalTime(&t[0]);
    ++i;
    _tprintf(_T("%ld-%d-%d %02d:%02d\n"),
        t[i].wYear, t[i].wMonth, t[i].wDay, 
        t[i].wHour, t[i].wMinute);

    //-30 days
    AddSeconds(&t[i], &t[i + 1], 60 * 60 * 24 * (-30));
    ++i;
    _tprintf(_T("%ld-%d-%d %02d:%02d\n"),
        t[i].wYear, t[i].wMonth, t[i].wDay, 
        t[i].wHour, t[i].wMinute);

    //+2 hours
    AddSeconds(&t[i], &t[i + 1], 60 * 60 * 2);
    ++i;
    _tprintf(_T("%ld-%d-%d %02d:%02d\n"),
        t[i].wYear, t[i].wMonth, t[i].wDay, 
        t[i].wHour, t[i].wMinute);

    return 0;
}
奖励园豆:5
hoodlum1980 | 小虾三级 |园豆:559 | 2015-05-26 00:33

3月31日减去一个月当然是希望得到2月28日(非闰年的话),加1个月希望得到4月30日,依次类推,逻辑如同.NET的datetime

Patrickz10 | 园豆:7 (初学一级) | 2015-05-29 10:27

虽然你的回答对于需要在linux运行的我来说没有多大作用,但还是感谢你的回答

Patrickz10 | 园豆:7 (初学一级) | 2015-05-29 10:28

@Patrickz10: 你说的那个减去一个月的定义,那就完全类似时分秒的那种进位借位法。这个不需要借助什么函数,完全是可以手工写出来的。只不过对2月的天数需要判断下是不是闰年而已。

hoodlum1980 | 园豆:559 (小虾三级) | 2015-05-29 17:37
其他回答(1)
0

用boost的日期时间函数

dudu | 园豆:31003 (高人七级) | 2015-05-19 16:32

boost似乎很庞大,是不是,我不想为了这么一点需要它的地方就引用它,太庞大了

支持(0) 反对(0) Patrickz10 | 园豆:7 (初学一级) | 2015-05-19 22:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册