Форум программистов, компьютерный форум CyberForum.ru

Подсчет даты - C++

Восстановить пароль Регистрация
 
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
26.07.2013, 01:21     Подсчет даты #1
Я наверное уже перегрелся за комом весь день писать код, но вот хоть тресни, видимо с математикой плохо. Помогите решить одну задачку.

есть дата 20.05.2013.

нужно подсчитать а то есть пройденные:
дни
часы
минуты
милисекунды (не обязательно)
начиная отсчет с 20.05.2013.

Как написать правильно? в голову совсем не лезет. Использую Win Form Application. Понимаю, раздел слегка не тот, но мне бы алгоритм увидеть. А то ну ни как в голову мысли не лезут

Если я правильно пишу про задачу, значит должно получится общее пройденное время со дня данной даты.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 01:21     Подсчет даты
Посмотрите здесь:

C++ Подсчет битов
Подсчет счимволов C++
C++ Подсчет производной
подсчет повторений C++
C++ Задача на подсчет
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
26.07.2013, 01:27     Подсчет даты #2
Назовем дату от которой будемначинать отсчет как А и сегодняшнюю дату как Б. Переводите обе даты в секунды. Назовем Ас и Бс соответственно.
Рс = Бс - Ас;
Пройденные...
секунды = Рс
минуты = Рс / 60
часы = минуты / 60
дни = часы / 24
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
26.07.2013, 01:36  [ТС]     Подсчет даты #3
Olivеr, так, а как дату перевести в секунды?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
26.07.2013, 04:29     Подсчет даты #4
честно говоря, с датами работаю плохо, но все же разобрался
вот рабочий код (Seconds::operator() возвращает дату переведенную в секунды)
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
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstdint>
 
struct Seconds
{
    constexpr static uint64_t month[12] =
            {
                0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 333
            };
 
    constexpr static uint64_t k = 24 * 60 * 60;
 
    uint64_t operator () (uint64_t d, uint64_t m, uint64_t y)
    {
        bool leap = y % 4 == 0 && y % 100 || y % 400 == 0;
        d += y * 365 + (y + 3) / 4 - (y + 99) / 100 + (y + 399) / 400;
        return (d + Seconds::month[m - 1] + (leap && m > 1 ? 1 : 0)) * Seconds::k;
    }
};
 
constexpr uint64_t Seconds::month[12];
constexpr uint64_t Seconds::k;
 
int main()
{
    uint64_t d1 = 20;
    uint64_t m1 = 5;
    uint64_t y1 = 2013;
 
    uint64_t d2 = 26;
    uint64_t m2 = 7;
    uint64_t y2 = 2013;
 
    uint64_t dx = Seconds()(d2, m2, y2) - Seconds()(d1, m1, y1);
    std::cout << dx / Seconds::k;
 
    return 0;
}
gazlan
2867 / 1815 / 272
Регистрация: 27.08.2010
Сообщений: 4,919
Записей в блоге: 1
26.07.2013, 05:00     Подсчет даты #5
Стандартный подход (астрономия итд.) для всех расчетов с датами - перевод в юлианскую дату и обратно.
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
26.07.2013, 22:04  [ТС]     Подсчет даты #6
Цитата Сообщение от Olivеr Посмотреть сообщение
честно говоря, с датами работаю плохо, но все же разобрался
вот рабочий код (Seconds::operator() возвращает дату переведенную в секунды)
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
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstdint>
 
struct Seconds
{
    constexpr static uint64_t month[12] =
            {
                0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 333
            };
 
    constexpr static uint64_t k = 24 * 60 * 60;
 
    uint64_t operator () (uint64_t d, uint64_t m, uint64_t y)
    {
        bool leap = y % 4 == 0 && y % 100 || y % 400 == 0;
        d += y * 365 + (y + 3) / 4 - (y + 99) / 100 + (y + 399) / 400;
        return (d + Seconds::month[m - 1] + (leap && m > 1 ? 1 : 0)) * Seconds::k;
    }
};
 
constexpr uint64_t Seconds::month[12];
constexpr uint64_t Seconds::k;
 
int main()
{
    uint64_t d1 = 20;
    uint64_t m1 = 5;
    uint64_t y1 = 2013;
 
    uint64_t d2 = 26;
    uint64_t m2 = 7;
    uint64_t y2 = 2013;
 
    uint64_t dx = Seconds()(d2, m2, y2) - Seconds()(d1, m1, y1);
    std::cout << dx / Seconds::k;
 
    return 0;
}
Ответ компиля :
C++
1
1>C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\cstdint(13) : fatal error C1083: Не удается открыть файл include: stdint.h: No such file or directory
Добавлено через 7 минут
если не трудно, прокоментируйте код, я попробую по своему написать
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
26.07.2013, 22:14     Подсчет даты #7
Цитата Сообщение от snyppimylt Посмотреть сообщение
если не трудно, прокоментируйте код, я попробую по своему написать
в коде нет ничего непонятного.
алгоритм примерно такой:
1) определяем является ли год високосным
2) считаем кол-во пройденных високосных годов
3) умножаем год на 365, прибавляем кол-во високосных. прибавляем пройденных дней до этого месяца и если текущий год високосный и месяц > 1, то еще + 1.
4) умножаем на секунды и возвращаем
Цитата Сообщение от snyppimylt Посмотреть сообщение
Ответ компиля :
можете убрать хедер <cstdint> и заменить все uint64_t на unsigned long long
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
26.07.2013, 22:20     Подсчет даты #8
Olivеr, а високосные года учитываете?
увидел
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
26.07.2013, 22:21     Подсчет даты #9
BigLow, разумеется)
я когда решал сверялся по этому сайту http://whoyougle.ru/time/delta
протестировал несколько дат. результат ок
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 12:08     Подсчет даты
Еще ссылки по теме:

C++ подсчет слов в С++
C++ Подсчет слов
На основе введенной даты рождения и текущей даты сообщить пользователю, сколько он прожил дней C++

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

Или воспользуйтесь поиском по форуму:
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
27.07.2013, 12:08  [ТС]     Подсчет даты #10
Спасибо, все понял)
Yandex
Объявления
27.07.2013, 12:08     Подсчет даты
Ответ Создать тему
Опции темы

Текущее время: 20:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru