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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Xessao
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 17
#1

Преобразование секунд в года - C++

02.09.2016, 12:14. Просмотров 240. Ответов 9
Метки нет (Все метки)

Добрый день, господа! Есть задача, вывести количество лет, месяцев, дней, часов, минут и секунд. Код написал, но выводит не всё корректно. Можете подсказать, почему выводит 5 дней, вместо 0 (как я ожидаю)?

C++
1
2
3
4
5
6
7
8
9
int
    time = 31536000,
    years = time / 31536000,
    months = (time / 2592000) % 12,
    days = (time / 86400) % 30,
    hours = (time / 3600) % 24,
    mins = (time / 60) % 60,
    secs = time % 60;
sprintf_s(str, "%02d.%02d.%d %02d:%02d:%02d", days, months, years, hours, mins, secs);
Вывод: 05.00.1 00:00:00
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2016, 12:14     Преобразование секунд в года
Посмотрите здесь:

C++ Как получить количество секунд, прошедших с 1 января 1970 года?
Конвертация даты из кол-ва секунд с 70-го года в нормальную C++
C++ Дано число года n. Найдите количество дней того года
Перевод секунд в часы и минуты C++
Рандомное число из *приставка*-секунд C++
C++ В этой программе создается "матрица" из секунд.Как мне первый ряд чисел (секунд) присвоить масиву?
Количество секунд в количество суток, часов, минут, секунд C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MansMI
1134 / 931 / 239
Регистрация: 08.01.2012
Сообщений: 3,362
02.09.2016, 12:28     Преобразование секунд в года #2
365-12*30=???
Xessao
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 17
02.09.2016, 12:32  [ТС]     Преобразование секунд в года #3
Цитата Сообщение от MansMI Посмотреть сообщение
365-12*30=???
Хм, а я подставлял у себя так: (31536000 / 3600) % 24. Получалось ноль.
MansMI
1134 / 931 / 239
Регистрация: 08.01.2012
Сообщений: 3,362
02.09.2016, 12:34     Преобразование секунд в года #4
чтот делители странные
Цитата Сообщение от Xessao Посмотреть сообщение
почему выводит 5 дней, вместо 0
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
02.09.2016, 20:52     Преобразование секунд в года #5
Цитата Сообщение от Xessao Посмотреть сообщение
почему выводит 5 дней, вместо 0 (как я ожидаю)?
Потому что ты неправильно переводишь.
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
#include <cstdio>
#include <cstdint>
 
int main() {
    uint64_t total_seconds = 31536000 + 2592000 + 86400 + 3600 + 60 + 1;
 
    uint64_t years = total_seconds / 31536000 /* seconds in a year */;
    total_seconds %= 31536000;
 
    uint64_t months = total_seconds / 2592000 /* seconds in a month */;
    total_seconds %= 2592000;
 
    uint64_t days = total_seconds / 86400 /* seconds in a day */;
    total_seconds %= 86400;
 
    uint64_t hours = total_seconds / 3600 /* seconds in a hour */;
    total_seconds %= 3600;
 
    uint64_t minutes = total_seconds / 60 /* seconds in a minute */;
    total_seconds %= 60;
 
    uint64_t seconds = total_seconds;
 
    printf( "%llu.%llu.%llu %02llu:%02llu:%02llu\n", years, months, days, hours, minutes, seconds );
}
Mr.X
Эксперт С++
3040 / 1685 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
02.09.2016, 23:01     Преобразование секунд в года #6
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <iostream>
///////////////////////////////////////////////////////////////////////////////
typedef unsigned long long  T_uint;
///////////////////////////////////////////////////////////////////////////////
const   T_uint  SEC_PER_MIN         =   60;
const   T_uint  MIN_PER_HOUR        =   SEC_PER_MIN;
const   T_uint  HOURS_PER_DAY       =   24;
const   T_uint  DAYS_PER_MONTH      =   31;
const   T_uint  MONTHS_PER_YEAR     =   12;
///////////////////////////////////////////////////////////////////////////////
T_uint  rand_val()
{
    return  rand()  %   10;
}
///////////////////////////////////////////////////////////////////////////////
void    print_values
    (
        T_uint  years,
        T_uint  months,
        T_uint  days,
 
        T_uint  hours,
        T_uint  minutes,
        T_uint  seconds
    )
{
    std::cout   <<  years       <<  '\t'    <<  "years"     <<  std::endl
                <<  months      <<  '\t'    <<  "months"    <<  std::endl
                <<  days        <<  '\t'    <<  "days"      <<  std::endl
 
                <<  hours       <<  '\t'    <<  "hours"     <<  std::endl
                <<  minutes     <<  '\t'    <<  "minutes"   <<  std::endl
                <<  seconds     <<  '\t'    <<  "seconds"   <<  std::endl
                                                            <<  std::endl;
}
///////////////////////////////////////////////////////////////////////////////
T_uint  set_quotient_and_get_remainder
    (
        T_uint      dividend,
        T_uint      divisor,
        T_uint  &   quotient
    )
{
    quotient    =   dividend    /   divisor;
    return          dividend    %   divisor;
}
///////////////////////////////////////////////////////////////////////////////
void        for_seconds_set_values
    (
        T_uint      seconds,
 
        T_uint  &   years,
        T_uint  &   months,
        T_uint  &   days,
 
        T_uint  &   hours,
        T_uint  &   minutes,
        T_uint  &   seconds_res
    )
{
    seconds_res     =   set_quotient_and_get_remainder
                            (
                                seconds,
                                SEC_PER_MIN,
                                minutes
                            );
 
    minutes         =   set_quotient_and_get_remainder
                            (
                                minutes,
                                MIN_PER_HOUR,
                                hours
                            );
 
    hours           =   set_quotient_and_get_remainder
                            (
                                hours,
                                HOURS_PER_DAY,
                                days
                            );
 
    days           =   set_quotient_and_get_remainder
                            (
                                days,
                                DAYS_PER_MONTH,
                                months
                            );
 
    months         =   set_quotient_and_get_remainder
                            (
                                months,
                                MONTHS_PER_YEAR,
                                years
                            );
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        T_uint  years       =   rand_val();
        T_uint  months      =   rand_val();
        T_uint  days        =   rand_val();
 
        T_uint  hours       =   rand_val();
        T_uint  minutes     =   rand_val();
        T_uint  seconds     =   rand_val();
 
        print_values
            (
                years,
                months,
                days,
 
                hours,
                minutes,
                seconds
            );
 
        months      +=  years       *   MONTHS_PER_YEAR;
        days        +=  months      *   DAYS_PER_MONTH;
        hours       +=  days        *   HOURS_PER_DAY;
 
        minutes     +=  hours       *   MIN_PER_HOUR;
        seconds     +=  minutes     *   SEC_PER_MIN;
 
        std::cout   <<  "total seconds: "
                    <<  seconds
                    <<  std::endl
                    <<  std::endl;
 
        years       =   0;
        months      =   0;
        days        =   0;
 
        hours       =   0;
        minutes     =   0;
 
        T_uint  remainder_seconds{};
 
        for_seconds_set_values
            (
                seconds,
                years,
                months,
 
                days,
                hours,
                minutes,
 
                remainder_seconds
            );
 
        print_values
            (
                years,
                months,
                days,
 
                hours,
                minutes,
                remainder_seconds
            );
 
        system("pause");
    }//for
}
Operok
139 / 137 / 40
Регистрация: 15.02.2015
Сообщений: 417
Завершенные тесты: 2
03.09.2016, 14:12     Преобразование секунд в года #7
date_time.h
Кликните здесь для просмотра всего текста
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
#include <cstdint>
 
struct date_time
{
    uint16_t
        year{},
        mon{},
        day{},
        hour{},
        min{},
        sec{},
        msec{};
 
    inline date_time(
        uint16_t y = 2000,
        uint16_t M = 1,
        uint16_t d = 1,
        uint16_t h = 0,
        uint16_t m = 0,
        uint16_t s = 0,
        uint16_t x = 0
    ) :
        year(y), mon(M), day(d), hour(h), min(m), sec(s), msec(x)
    {
    }
    date_time(uint64_t);    //msec
 
    uint64_t to_msec() const;
};

date_time.cpp
Кликните здесь для просмотра всего текста
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include "date_time.h"
 
enum : uint64_t
{
    MsecInSec = 1000,
    SecInMin = 60,
    MinInHour = 60,
    HourInDay = 24,
    MsecInMin = SecInMin * MsecInSec,
    MsecInHour = MsecInMin * MinInHour,
    MinInDay = MinInHour * HourInDay,
    SecInDay = MinInDay * SecInMin,
    MsecInDay = SecInDay * MsecInSec,
 
    DaysInYear = 365,
    DaysIn4Years = DaysInYear * 4 + 1,
    DaysIn100Years = DaysIn4Years * 25 - 1,
    DaysIn400Years = DaysIn100Years * 4 + 1,
 
    MsecInYear = DaysInYear * MsecInDay,
    MsecIn4Years = DaysIn4Years * MsecInDay,
    MsecIn100Years = DaysIn100Years * MsecInDay,
    MsecIn400Years = DaysIn400Years * MsecInDay
};
 
constexpr uint16_t months[2][12] = {
    { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, //not leap
    { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }  //leap
};
 
date_time::date_time(uint64_t total_msec)
{
    auto days = total_msec / MsecInDay;
    total_msec %= MsecInDay;
    hour = total_msec / MsecInHour;
    total_msec %= MsecInHour;
    min = total_msec / MsecInMin;
    total_msec %= MsecInMin;
    sec = total_msec / MsecInSec;
    msec = total_msec % MsecInSec; 
 
    auto total_400y = days / DaysIn400Years;
    year += 400 * total_400y;
    days %= DaysIn400Years;
    auto total_100y = days / DaysIn100Years;
 
    if (4 == total_100y) {      //этот день последний в 400-летке
        year += 399; 
        days = 30;
        mon = 11;
    }
    else {
        year += 100 * total_100y;
        if (0 != (days %= DaysIn100Years)) {
            auto total_4y = days / DaysIn4Years;
            year += 4 * total_4y;
            days %= DaysIn4Years;
            auto total_y = days / DaysInYear;
            if (4 == total_y) {     //этот день помледний в 4-летке
                year += 3;
                days = 30;
                mon = 11;
            }
            else {
                year += total_y;
                auto is_leap = (3 == total_y) && (24 != total_4y || (24 == total_4y && 3 == total_100y));
                days %= DaysInYear;
 
                if (0 != days)
                    while (days >= months[is_leap][mon])
                        days -= months[is_leap][mon++];
            }
        }
    }
    ++year;
    ++mon;
    day = days + 1;
}
 
inline bool year_is_leap(uint16_t year)
{
    return (0 == year % 400) || ((0 != year % 100) && (0 == year % 4));
}
 
uint64_t date_time::to_msec() const
{
    uint64_t days{};
    auto remain_y = year - 1;
    auto is_leap = year_is_leap(year);
    days += DaysIn400Years * (remain_y / 400);
 
    if (0 != (remain_y %= 400)) {
        days += DaysIn100Years * (remain_y / 100);
        if (0 != (remain_y %= 100)) {
            days += DaysIn4Years * (remain_y / 4);
            days += DaysInYear * (remain_y % 4);
        }
    }
 
    for (size_t j{ 1 }; j < mon; ++j)
        days += months[is_leap][j - 1];
 
    days += day - 1;
 
    return days * MsecInDay + hour * MsecInHour + min * MsecInMin + sec * MsecInSec + msec;
}

main.cpp пример
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
#include "date_time.h"
 
using namespace std;
 
int main()
{
    date_time dt(1700, 12, 31, 23, 59 ,59, 999);
    auto msec = dt.to_msec();
 
    cout << "Milliseconds: " << msec << endl;
 
    date_time new_dt(msec);
 
    char buf[24];
 
    sprintf_s(
        buf,
        "%04d.%02d.%02d %02d:%02d:%02d.%03d",
        new_dt.year,
        new_dt.mon,
        new_dt.day,
        new_dt.hour,
        new_dt.min,
        new_dt.sec,
        new_dt.msec);
 
    cout << "DateTime: " << buf << endl;
 
    system("pause");
}
vlisp
328 / 297 / 51
Регистрация: 10.08.2015
Сообщений: 719
Завершенные тесты: 1
03.09.2016, 14:35     Преобразование секунд в года #8
при большом количестве секунд, нужно учитывать високосные года
castaway
Эксперт С++
4880 / 3016 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
03.09.2016, 15:13     Преобразование секунд в года #9
Цитата Сообщение от vlisp Посмотреть сообщение
при большом количестве секунд, нужно учитывать високосные года
У ТС проблема не с этим. Судя по его коду, на високосные года ему плевать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2016, 15:43     Преобразование секунд в года
Еще ссылки по теме:

Перевод секунд в минуты C++
C++ 1 января не високосного года-понедельник. Вводится число и месяц этого года. Вывести день недели этого дня
C++ Заданы число и месяц невисокосного года. Вычислить порядковый номер даты, начиная отсчет с начала года
Преобразование секунд в дату и время C++
Конвертировать строку с датой и временем в число секунд и наоборот - число секунд в дату и время C++

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

Или воспользуйтесь поиском по форуму:
Olej
123 / 117 / 13
Регистрация: 25.03.2012
Сообщений: 456
03.09.2016, 15:43     Преобразование секунд в года #10
Цитата Сообщение от castaway Посмотреть сообщение
У ТС проблема не с этим. Судя по его коду, на високосные года ему плевать.

Судя по его коду до високосных лет он доберётся ещё очень не скоро...
Yandex
Объявления
03.09.2016, 15:43     Преобразование секунд в года
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru