3

我有一个 c++ 代码,我可以通过它从输入的 excel 日期开始计算/操作(通过操作我的意思是我可以通过特定的增量增加/减少输入日期或对其进行其他计算)。

我在我的代码中使用变量 time_t。根据 msdn 文档 time_t 是自 1970 年 1 月 1 日以来经过的秒数。所以给定一个输入日期,我首先计算自 01/01/1970 以来经过的秒数,将其存储在 time_t vcariable 中,然后使用 localtime() 进行所有其他计算。

我的代码可以正常工作,因为我的输入日期超过 01/01/1970 但在此之前的日期会中断。

问题:在 1970 年 1 月 1 日之前,我是否可以使用任何其他变量或结构。或者有没有办法在 01/01/1970 之前操纵 time_t 变量。

提前致谢

我从 1970 年 2 月 1 日开始。我想将月份减少 2。首先我使用

void localtime(int* py = 0, int* pm = 0, int* pd = 0, 
            int* ph = 0, int* pn = 0, int* ps = 0,
            int* pwday = 0, int* pyday = 0, int* pisdst = 0) const
{
    struct tm* ptm = ::localtime(&t_); 
    if (py) *py = ptm->tm_year + 1900;
    if (pm) *pm = ptm->tm_mon + 1;
    if (pd) *pd = ptm->tm_mday;
    if (ph) *ph = ptm->tm_hour;
    if (pn) *pn = ptm->tm_min;
    if (ps) *ps = ptm->tm_sec;
    if (pwday) *pwday = ptm->tm_wday;
    if (pyday) *pyday = ptm->tm_yday;
    if (pisdst) *pisdst = ptm->tm_isdst;
}

然后我使用: maketime(y, m + count, d, h, n, s); 其中 y=1970, m=2, count=-2, d=1 (来自上述代码的输出。maketime() 如下:

void maketime(int y, int m, int d, int h = 0, int n = 0, int s = 0)
{
    struct tm t;
    t.tm_year = y - 1900;
    t.tm_mon  = m - 1;
    t.tm_mday = d;
    t.tm_hour = h;
    t.tm_min  = n;
    t.tm_sec  = s;
    t.tm_isdst = -1;

    t_ = ::mktime(&t);
}

这导致 t_ =-1。

现在在这个结果上,我再次调用 localtime() 并

     struct tm* ptm = ::localtime(&t_);  

当 t_ = -1 时,localtime() 中的第一行失败。

4

1 回答 1

3

FILETIME类似地基于整数计数,在这种情况下为 100 纳秒间隔,并且一直追溯到 1601。

看到您的编辑后,问题似乎很简单:您需要确保tm结构的所有元素都在界限内。加减月份时,需要调整,直到月份数在 0 到 11 之间。无论您使用time_t或,都是这种情况FILETIME

while (m < 0)
{
    m += 12;
    y -= 1;
}
while (m > 11)
{
    m -= 12;
    y += 1;
}

我不确定如果这一天超过一个月的天数会发生什么,例如,如果您尝试从 3 月 31 日减去 1 个月。

于 2012-11-20T20:27:12.510 回答