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

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

Восстановить пароль Регистрация
 
Xessao
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 17
02.09.2016, 12:14     Преобразование секунд в года #1
Добрый день, господа! Есть задача, вывести количество лет, месяцев, дней, часов, минут и секунд. Код написал, но выводит не всё корректно. Можете подсказать, почему выводит 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MansMI
Нарушитель
1047 / 844 / 205
Регистрация: 08.01.2012
Сообщений: 3,032
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
Нарушитель
1047 / 844 / 205
Регистрация: 08.01.2012
Сообщений: 3,032
02.09.2016, 12:34     Преобразование секунд в года #4
чтот делители странные
Цитата Сообщение от Xessao Посмотреть сообщение
почему выводит 5 дней, вместо 0
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 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
Эксперт С++
 Аватар для Mr.X
2803 / 1579 / 247
Регистрация: 03.05.2010
Сообщений: 3,667
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
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 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
290 / 259 / 40
Регистрация: 10.08.2015
Сообщений: 626
Завершенные тесты: 1
03.09.2016, 14:35     Преобразование секунд в года #8
при большом количестве секунд, нужно учитывать високосные года
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 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++
Преобразование секунд в дату и время C++

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

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

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

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