c++time_t返回到1970年1月1日之前

c++ time_t going back before 1/1/1970

本文关键字:1月 日之 1970年 返回 c++time      更新时间:2023-10-16

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

我在代码中使用了变量timet。accroding to msdn documentation time_t是自1970年1月1日以来经过的秒数。因此,给定一个输入日期,我首先计算自1970年1月1日以来的延迟秒数,将其存储在timet变量中,然后使用localtime()进行所有其他计算。

我的代码运行良好,因为我的输入日期超过1970年1月1日,但在此之前的日期会出现故障。

问题:在1970年1月1日之前,我可以使用其他变量或结构吗。或者有没有一种方法可以操纵time_t变量到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_=-1。

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

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

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

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个月。