Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/26: Рейтинг темы: голосов - 26, средняя оценка - 4.92
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1

Сумма и разность дат

02.01.2012, 20:42. Показов 4739. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс содержащий: год, месяц, день, час, минуты, секунды.
Фактически это всё можно было бы заменить структурой tm из time.h, но это не желательно.
В общем возник вопрос - как можно попроще суммировать две даты или посчитать их разность?
Изобретать велосипед не хочется, моя версия состоит в использовании lokaltime() и mktime() из time.h.
Вот немного индусский и почему то не правильно работающий пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
tm t1;
    t1.tm_sec = obj1.ss;
    t1.tm_min = obj1.mm;
    t1.tm_hour = obj1.hh;
    t1.tm_mday = obj1.DD;
    t1.tm_mon = obj1.MM;
    t1.tm_year = obj1.YY - 1900;
 
    tm t2;
    t2.tm_sec = obj2.ss;
    t2.tm_min = obj2.mm;
    t2.tm_hour = obj2.hh;
    t2.tm_mday = obj2.DD;
    t2.tm_mon = obj2.MM;
    t2.tm_year = obj2.YY - 1900;
 
    time_t tt1 = mktime(&t1), tt2 = mktime(&t2);
    time_t tstr = tt2 - tt1;
    tm *tim = localtime(&tstr);
Словестное пояснение:
Инициализируем структуры t1 и t2 хранящимися в классе значениями, переводим всё это при помощи mktime() в секунды прошедшие с 1900 года, считаем разность(или сумму) в секундах и при помощи localtime() переводим обратно.

Есть одно но, получается глупость:
(формат: гггг мм дд чч мм сс)


Как быть? Что посоветуете?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.01.2012, 20:42
Ответы с готовыми решениями:

Классы: Разность дат С++
Народ объясните как переделать эту программу чтобы работала через классы...я просто запутался сам #include <cstdlib> #include...

Функция вычисляющая разность дат
Помогите,пожалуйста написать программу на C++. Создать функцию, которая принимает на вход даты рождения двух людей и возвращает на...

Сумма\разность матриц
Помогите плиз написать программу . Нужно составить программу , вычисляющую сумму и разность двух матриц размеров 3х3 .

5
3 / 3 / 1
Регистрация: 21.12.2011
Сообщений: 10
02.01.2012, 22:51
Привет!

Вообще говоря, непонятно, почему не работает: я ввел такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<ctime>
#include<iostream>
 
int main() {
        tm t1;
        t1.tm_sec = 5;
        t1.tm_min = 30;
        t1.tm_hour = 12;
        t1.tm_mday = 30;
        t1.tm_mon = 11;
        t1.tm_year = 2011 - 1900;
 
        tm t2;
        t2.tm_sec = 5;
        t2.tm_min = 30;
        t2.tm_hour = 12;
        t2.tm_mday = 30;
        t2.tm_mon = 11;
        t2.tm_year = 2011 - 1900;
 
        time_t tt1 = mktime(&t1), tt2 = mktime(&t2);
        time_t tstr = tt2 - tt1;
        tm *tim = localtime(&tstr);
 
        std::cout << tstr << '\n';
        system("pause");        return 0;
}
и он вывел ожидаемый ноль. (При изменении числа секунд и минут результат изменяется соответственно и правильно.)

Так что, причина, похоже, - в объектах obj1 и obj2.
0
Программист
33 / 33 / 8
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
03.01.2012, 00:37  [ТС]
В mktime() передаётся нуль, и по логике в получившейся структуре должно получаться что-то вроде: 0 0 1 0 0 0
, тк tm имеет вид:
C++
1
2
3
4
5
6
7
8
9
10
11
struct tm {
        int tm_sec;     /* seconds after the minute - [0,59] */
        int tm_min;     /* minutes after the hour - [0,59] */
        int tm_hour;    /* hours since midnight - [0,23] */
        int tm_mday;    /* day of the month - [1,31] */
        int tm_mon;     /* months since January - [0,11] */
        int tm_year;    /* years since 1900 */
        int tm_wday;    /* days since Sunday - [0,6] */
        int tm_yday;    /* days since January 1 - [0,365] */
        int tm_isdst;   /* daylight savings time flag */
        };
, но там получается 70 0 1 3 0 0 ... почему так?
*(формат: гггг мм дд чч мм сс)
0
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
03.01.2012, 02:37
Потому, что эпоха юникс считается не с 1900. И ещё потому, что, видимо, gtm+3
1
3 / 3 / 1
Регистрация: 21.12.2011
Сообщений: 10
03.01.2012, 03:14
(
В mktime() передаётся нуль, ...
Ты, конечно, имел в виду, что нуль передается в localtime().
)

Теперь - по сути вопроса:

Дело в том, что функция localtime выводит именно это - local time.

В то время, когда по UTC было
гггг.мм.дд.чч.мм.сс
1970..0..1..0..0..0
, то есть
00:00 1 января 1970 года,
местное время на твоей долготе было
гггг.мм.дд.чч.мм.сс
1970..0..1..3..0..0
, то есть
03:00 1 января 1970 года.
Вот откуда в выводе - тройка вместо ожидаемой единицы. А "70", очевидно, происходит из того, что, хотя localtime получает в программе ноль как аргумент, она вычисляет количество лет от 1900 года, а не от 1970-го.

Поэтому-то в выводе localtime() - 70..0..1..3..0..0.

Результат "70..0..1..0..0..0" дала бы функция gmtime().

Поскольку отрицательные значения агрумента в обеих этих функциях запрещены,
70..0..1..3..0..0 и
70..0..1..0..0..0
являются минимальными возможными значениями localtime() и gmtime(), соответственно. (Для localtime - это минимальное значение *на твоей долготе*.)

Удачи,
Никки
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.01.2012, 11:38
Whiteha, посмотри сюда Класс "Историческое событие"
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.01.2012, 11:38
Помогаю со студенческими работами здесь

Сумма и разность в строках
Здравствуйте, возникла проблема в решении задачи. Условие задачи: &quot;Строка символов состоит из произвольных чисел, разделенных...

Сумма, разность, перемножение матриц
2-е матрицы 3 на 3. необходимо реализовать сложение, разность и перемножение. Пробовал преподу это припихнуть, но он меня отправил и...

Сумма (разность) цифр числа
Помогите, пожалуйста разобраться. Вводим число, например 27 568. Необходимо найти 2-7+5-6+8. Как это осуществить? Как просто сумму всех...

Сумма, разность, произведение элементов в одномерном массиве
Ребят, помогите, пожалуйста. В одномерном целочисленном массиве найти сумму всех элементов, произведение нечетных элементов и разность...

Найти числа X и Y, сумма которых равно A, а разность равна B
Найти числа X и Y, сумма которых равно A, а разность равна B. Вывести найденные значения, а также, для контроля, – их сумму и разность....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru