我只能给一个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; }
3月31日减去一个月当然是希望得到2月28日(非闰年的话),加1个月希望得到4月30日,依次类推,逻辑如同.NET的datetime
虽然你的回答对于需要在linux运行的我来说没有多大作用,但还是感谢你的回答
@Patrickz10: 你说的那个减去一个月的定义,那就完全类似时分秒的那种进位借位法。这个不需要借助什么函数,完全是可以手工写出来的。只不过对2月的天数需要判断下是不是闰年而已。
用boost的日期时间函数
boost似乎很庞大,是不是,我不想为了这么一点需要它的地方就引用它,太庞大了