Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

02.09.2016, 12:14. Просмотров 310. Ответов 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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2016, 12:14
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Преобразование секунд в года (C++):

Конвертация даты из кол-ва секунд с 70-го года в нормальную - C++
Поскажите как конвертировать дату из количества секунд с 70-го года в нормальную.

Как получить количество секунд, прошедших с 1 января 1970 года? - C++
Здравствуйте. Как получить количество секунд, прошедших с 1 января 1970 года? Это значение чтобы было в обычной переменной. На СИ.

Преобразование секунд в дату и время - C++
Как перевести секунды в дату и время? Но не с 1 января 1970 года, а просто в дату. Уже браузер виснет от вкладок :wall: Вот...

В этой программе создается "матрица" из секунд.Как мне первый ряд чисел (секунд) присвоить масиву? - C++
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include...

Конвертировать строку с датой и временем в число секунд и наоборот - число секунд в дату и время - C++
Здравствуйте. Подскажите пожалуйста есть строки типа char/string: 2015.04.30 06:30 как перевести данное время в число секунд. И...

Дано число года n. Найдите количество дней того года - C++
1) Даны три действительных числа x, y, z. Пусть программа выдаст мин и макс их значения. Сначала выведет минимум, потом максимум. 2) Даны...

9
MansMI
1375 / 1154 / 340
Регистрация: 08.01.2012
Сообщений: 4,509
02.09.2016, 12:28 #2
365-12*30=???
0
Xessao
0 / 0 / 0
Регистрация: 13.07.2015
Сообщений: 17
02.09.2016, 12:32  [ТС] #3
Цитата Сообщение от MansMI Посмотреть сообщение
365-12*30=???
Хм, а я подставлял у себя так: (31536000 / 3600) % 24. Получалось ноль.
0
MansMI
1375 / 1154 / 340
Регистрация: 08.01.2012
Сообщений: 4,509
02.09.2016, 12:34 #4
чтот делители странные
Цитата Сообщение от Xessao Посмотреть сообщение
почему выводит 5 дней, вместо 0
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 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 );
}
0
Mr.X
Эксперт С++
3060 / 1705 / 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
}
0
Operok
172 / 170 / 46
Регистрация: 15.02.2015
Сообщений: 492
Завершенные тесты: 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");
}
0
vlisp
439 / 406 / 78
Регистрация: 10.08.2015
Сообщений: 1,362
Завершенные тесты: 1
03.09.2016, 14:35 #8
при большом количестве секунд, нужно учитывать високосные года
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
03.09.2016, 15:13 #9
Цитата Сообщение от vlisp Посмотреть сообщение
при большом количестве секунд, нужно учитывать високосные года
У ТС проблема не с этим. Судя по его коду, на високосные года ему плевать.
0
Olej
161 / 170 / 20
Регистрация: 25.03.2012
Сообщений: 712
03.09.2016, 15:43 #10
Цитата Сообщение от castaway Посмотреть сообщение
У ТС проблема не с этим. Судя по его коду, на високосные года ему плевать.

Судя по его коду до високосных лет он доберётся ещё очень не скоро...
0
03.09.2016, 15:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2016, 15:43
Привет! Вот еще темы с ответами:

Заданы число и месяц невисокосного года. Вычислить порядковый номер даты, начиная отсчет с начала года - C++
Заданы два натуральных числа a,b которые обозначают число и месяц не високосного года. Вычислить порядковый номер даты, начиная отсчет с...

Количество секунд в количество суток, часов, минут, секунд - C++
Напишите программу, которая выдавала бы запрос на ввод количества секунд в виде целого значения ( используйте тип long) , и затем...

1 января не високосного года-понедельник. Вводится число и месяц этого года. Вывести день недели этого дня - C++
1 января не високосного года-понедельник. Вводится число и месяц этого года. Вывести день недели этого дня

Преобразование типа или преобразование типа указателя ? - C++
Добрый день. Помогите пожалуйста понять что делает вот эта команда: out.write ((char *) &amp;n, sizeof n); Она что, перед записью в файл...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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