С++ time_t возвращается до 01.01.1970

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

я использую переменную time_t в своем коде. согласно документации msdn time_t — это количество секунд, прошедших с 01.01.1970. поэтому, учитывая дату ввода, я сначала вычисляю прошедшие секунды с 01.01.1970, сохраняю их в vcariable 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.


person user1612986    schedule 20.11.2012    source источник
comment
Вы знаете, что нет способа манипулировать переменной time_t до 01.01.1970, потому что документация говорит вам об этом.   -  person Jonathan Wood    schedule 21.11.2012
comment
time_t - это значение со знаком, поэтому я не понимаю, какие у вас проблемы. Можете быть более конкретными?   -  person Mark Ransom    schedule 21.11.2012
comment
привет Марк, я обновил свой пост кодом, который я использую. и описал, где я терплю неудачу.   -  person user1612986    schedule 21.11.2012


Ответы (1)


FILETIME также основан на целочисленном подсчете, в данном случае с интервалом в 100 наносекунд, и восходит к 1601.

После просмотра вашего редактирования проблема кажется простой: вам нужно убедиться, что все элементы tm struct находятся в допустимых пределах. Когда вы добавляете или вычитаете месяцы, вам нужно корректировать, пока номер месяца не будет между 0 и 11. Это тот случай, когда вы используете time_t или FILETIME.

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

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

person Mark Ransom    schedule 20.11.2012