Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;时间不能追溯到1970年1月1日之前 我有一个C++代码,通过它可以从输入Excel日期开始计算/操作(通过操作,我的意思是我可以通过特定的增量来增加/减少输入数据,或者在它上面做其他计算)。_C++_Visual Studio 2010_Time T - Fatal编程技术网

c++;时间不能追溯到1970年1月1日之前 我有一个C++代码,通过它可以从输入Excel日期开始计算/操作(通过操作,我的意思是我可以通过特定的增量来增加/减少输入数据,或者在它上面做其他计算)。

c++;时间不能追溯到1970年1月1日之前 我有一个C++代码,通过它可以从输入Excel日期开始计算/操作(通过操作,我的意思是我可以通过特定的增量来增加/减少输入数据,或者在它上面做其他计算)。,c++,visual-studio-2010,time-t,C++,Visual Studio 2010,Time T,我在代码中使用可变时间。根据msdn文件,time\u t是自1970年1月1日起的秒数。因此,给定一个输入日期,我首先计算自1970年1月1日以来的弹性秒,将其存储在一个时间变量中,然后使用localtime()进行所有其他计算 我的代码工作正常,因为我的输入日期超过1970年1月1日,但在此之前的日期会出现故障 问题:在1970年1月1日之前,我还可以使用其他变量或结构吗。或者是否有一种方法可以操纵时间变量,使其在1970年1月1日之前运行 提前谢谢 我从1970年1月2日开始。我想把这个月

我在代码中使用可变时间。根据msdn文件,time\u t是自1970年1月1日起的秒数。因此,给定一个输入日期,我首先计算自1970年1月1日以来的弹性秒,将其存储在一个时间变量中,然后使用localtime()进行所有其他计算

我的代码工作正常,因为我的输入日期超过1970年1月1日,但在此之前的日期会出现故障

问题:在1970年1月1日之前,我还可以使用其他变量或结构吗。或者是否有一种方法可以操纵时间变量,使其在1970年1月1日之前运行

提前谢谢

我从1970年1月2日开始。我想把这个月减少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_u0=-1

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

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

localtime()中的第一行在t_uz=-1时失败。

FILETIME
类似地基于整数计数,在本例中为100纳秒的间隔,它一直返回到1601

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

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

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

你知道没有办法操纵时间变量到1970年1月1日之前,因为文档告诉你。
time\u t
是一个有符号的值,所以我不明白你遇到了什么问题有。你能更具体一点吗?嗨,马克,我已经用我正在使用的代码更新了我的帖子。并描述了我失败的地方。