c ++ time_t在1970年1月1日之前回归

时间:2012-11-20 20:23:07

标签: c++ visual-studio-2010 time-t

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

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

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

问题:在1970年1月1日之前我是否可以使用任何其他变量或结构。或者有没有办法在1990年1月1日之前操纵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()内的第一行失败。

1 个答案:

答案 0 :(得分:3)

FILETIME同样基于整数计数,在这种情况下为100纳秒间隔,并且它一直回到1601。

看到你的编辑后,问题似乎很简单:你需要确保tm struct的所有元素都在边界内。当您添加或减去月份时,您需要进行调整,直到月份数介于0到11之间。无论您使用的是time_t还是FILETIME,都属于这种情况。

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

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