Как добавить однажды ко времени, полученному со времени ()

18
задан ks1322 30 May 2016 в 14:24
поделиться

4 ответа

используйте gmtime () для преобразования time_t к , структура tm

добавляет тот ко дню ( tm_mday)

использование mktime () для преобразования структура tm назад к , time_t

видит time.h для большего количества информации

Редактирование:

я просто попробовал его, это работает:

int main()
{
  time_t base = 1142085600;
  for(int i = 0; i < 4; ++i) {
    struct tm* tm = localtime(&base);
    tm->tm_mday += i;
    time_t next = mktime(tm);
    std::cout << ctime(&next);
 }
 return 0;
}
21
ответ дан 30 November 2019 в 07:34
поделиться

Просто добавьте 24*60*60. Это не должно перестать работать в течение DST, так как UTC никогда не будет использовать DST.

, Если это перестало работать, затем Вы не используете UTC где-нибудь в Вашем коде. Удалите зависимость часового пояса.

5
ответ дан 30 November 2019 в 07:34
поделиться

Решение FigBug будет работать почти [1 110] каждый раз, но требуется DST, зафиксируйте: TM-> tm_isdst =-1

положительный А или 0 значений для tm_isdst заставляет mktime () предполагать первоначально, что Летнее время, соответственно, или не в действительности в течение требуемого времени. Отрицательная величина для tm_isdst заставляет mktime () пытаться определить, является ли Летнее время в действительности в течение требуемого времени.

(заключенный в кавычки от mktime спецификация )

int main()
{
  time_t base = 1142085600;
  for(int i = 0; i < 4; ++i) {
    struct tm* tm = localtime(&base);
    tm->tm_mday += i;
    tm->tm_isdst = -1;        // don't know if DST is in effect, please determine
                              // this for me
    time_t next = mktime(tm);
    std::cout << ctime(&next);
 }
 return 0;
}

Иначе будет ошибка (пример в течение Московского Летнего времени, которое запускает 29 марта 2009 1:59:59):

int main()
{
    // 28 March 2009 05:00:00 GMT ( local - 08:00 (MSK) )
    time_t base = 1238216400;

    std::time_t start_date_t = base;
    std::time_t end_date_t = base;

    std::tm start_date = *std::localtime(&start_date_t);
    std::tm end_date = *std::localtime(&end_date_t);

    end_date.tm_mday += 1;
//    end_date.tm_isdst = -1;

    std::time_t b = mktime(&start_date);
    std::time_t e = mktime(&end_date);

    std::string start_date_str(ctime(&b));
    std::string stop_date_str(ctime(&e));

    cout << " begin (MSK) (DST is not active): " << start_date_str;
    cout << " end   (MSD) (DST is active):     " << stop_date_str;
}

Вывод:

begin (MSK) (DST is not active): Sat Mar 28 08:00:00 2009
end   (MSD) (DST is active):     Sun Mar 29 09:00:00 2009
5
ответ дан 30 November 2019 в 07:34
поделиться

У меня всегда был лучший результат с хранением меток времени UTC, и преобразуйте их в указанный часовой пояс (включая переход на летнее время), когда Вы хотите отобразить значения.

Это сохраняет много стычки как это (и делает Вашу программу независимой от часовых поясов.

3
ответ дан 30 November 2019 в 07:34
поделиться