Visual Studio 2010 — c ++ time_t, возвращающийся до 01.01.1970

У меня есть код на C ++, с помощью которого я могу вычислять / манипулировать, начиная с входной даты Excel (под манипулированием я подразумеваю, что могу увеличить / уменьшить входную дату с определенным приращением или выполнить другие вычисления на ней).

Я использую переменную time_t в моем коде. Согласно документации MSDN, time_t — это количество секунд, прошедшее с 01.01.1970. поэтому, учитывая введенную дату, я сначала вычисляю количество секунд, прошедших с 01.01.1970, сохраняю их в переменную time_t и позже использую localtime () для всех остальных вычислений.

мой код работает нормально, поскольку моя дата ввода больше, чем 01.01.1970, но разбивается на даты до этого.

Вопрос: есть ли другие переменные или структуры, с помощью которых я могу перейти до 01.01.1970. или есть способ манипулировать переменной time_t до 01.01.1970.

заранее спасибо

Я начинаю с 01.02.1970. я хочу уменьшить месяц на 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_);

первая строка внутри localtime () завершается ошибкой, когда t_ = -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;
}

Я не уверен, что произойдет, если день превысит количество дней в месяце, например, если вы попытаетесь вычесть 1 месяц из 31 марта.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]