0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 3
1

Перевод времени - секунды с 1970 в наше время

07.06.2015, 21:19. Показов 3088. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день уважаемый программисты. Недавно начал изучать С++ и в качестве упражнения для себя захотел сделать программу (готовые функции мне пока не нужны) которая переводит секунды с 1970 в наше время ... алгоритм какой придумал - такой и реализовал ))) работает, но вот беда, программа ошибается ровно на 1 день ( за 45 лет). Что только не делал - не помогает, подумал что где-то с високосным годом ошибся, так вроде нет (11 високосных годов было с 70) все пересмотрел. Помогите пожалуйста решить задачку . Вы только не сильно ругайтесь на код программы, опыта мало ...
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
#include <iostream>
#include <ctime>
 
using std::cout;
using std::cin;
using std::endl;
 
void my_time (long long* fulltime, int* year , int* month, int* day, int* hour, int* min, int* sec, bool* visokos_year ) //крутая функция с указателями !!!! =)
{
    *year = 1970; //старт 
    const int sec_day  = 86400; 
    int s4et_visokiy_god = 1; //следующий високосный год 72, начинаем не с 0, а 1
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    while (1)
    {
        
        if (s4et_visokiy_god > 3) //каждый 4 год у нас високосный
        {
            s4et_visokiy_god = 0; //обнуляем счет. виск. года 
            if (*fulltime > 31622400) //високосный годовой запас секунд. 
                {
                    *fulltime = *fulltime - 31622400; 
                    (*year)++; 
                    
                }
                else
                {
                    *visokos_year = true; //флажок - ВИСОКОСНЫЙ ГОД
                    break;
                }
        } 
        else {
                if (*fulltime > 31536000) //нормальный годовой запас секунд. 
                    {
                        *fulltime = *fulltime -  31536000; //отнимаем нормальный год в секундах
                        (*year)++;  //добавляем год
                        
                    }
                    else 
                    {
                        *visokos_year = false; //флажок - НОРМАЛЬНЫЙ ГОД
                        break; //если не может посчитать год, тогда выходим из цикла
                    }
            }
        (s4et_visokiy_god) ++; 
    }
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if  (!(*visokos_year)) 
        {
    if(*fulltime < (sec_day * 31)  ) // проверка 1 месяца НОРМАЛЬНО ГОДА 31
    {*month = 1; *fulltime = *fulltime - 0;} else
 
    if(*fulltime < (sec_day * (31+28))  ) // проверка 2 месяца НОРМАЛЬНО ГОДА    28
    {*month = 2; *fulltime = *fulltime - sec_day * (     31   )     ;} else
 
    if(*fulltime < (sec_day * (31+28+31))  ) // проверка 3 месяца НОРМАЛЬНО ГОДА 31
    {*month = 3; *fulltime = *fulltime - sec_day * (     31+28   )      ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30))  ) // проверка 4 месяца НОРМАЛЬНО ГОДА  30
    {*month = 4; *fulltime = *fulltime - sec_day * (     31+28+31    )      ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30+31))  ) // проверка 5 месяца НОРМАЛЬНО ГОДА   31
    {*month = 5; *fulltime = *fulltime - sec_day * (     31+28+31+30    )       ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30+31+30))  ) // проверка 6 месяца НОРМАЛЬНО ГОДА    30
    {*month = 6; *fulltime = *fulltime - sec_day * (     31+28+31+30+31   )     ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30+31+30+31))  ) // проверка 7 месяца НОРМАЛЬНО ГОДА 31 
    {*month = 7; *fulltime = *fulltime - sec_day * (     31+28+31+30+31+30  )   ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30+31+30+31+31))  ) // проверка 8 месяца НОРМАЛЬНО ГОДА  31
    {*month = 8; *fulltime = *fulltime - sec_day * (     31+28+31+30+31+30+31  )    ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30+31+30+31+31+30))  ) // проверка 9 месяца НОРМАЛЬНО ГОДА   30
    {*month = 9; *fulltime = *fulltime - sec_day * (     31+28+31+30+31+30+31+31  ) ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30+31+30+31+31+30+31))  ) // проверка 10 месяца НОРМАЛЬНО ГОДА 31
         {*month = 10; *fulltime = *fulltime - sec_day * (    31+28+31+30+31+30+31+31+30  ) ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30+31+30+31+31+30+31+30))  ) // проверка 11 месяца НОРМАЛЬНО     30 
    {*month = 11; *fulltime = *fulltime - sec_day * (    31+28+31+30+31+30+31+31+30+31 )    ;} else
 
    if(*fulltime < (sec_day * (31+28+31+30+31+30+31+31+30+31+30+31))  ) // проверка 12 месяца НОРМАЛЬНО 
    {*month = 12; *fulltime = *fulltime - sec_day * (    31+28+31+30+31+30+31+31+30+31+30  )        ;} 
            }
        else 
            {
if(*fulltime < (sec_day * 31)  ) // проверка 1 месяца ВИСОКОСНОГО ГОДА 31
{*month = 1; *fulltime = *fulltime - 0;} else
 
if(*fulltime < (sec_day * (31+29) )  ) // проверка 2 месяца ВИСОКОСНОГО ГОДА   29
{*month = 2; *fulltime = *fulltime - sec_day *(     31   );} else
 
if(*fulltime < (sec_day * (31+29+31))  ) // проверка 3 месяца ВИСОКОСНОГО ГОДА 31
{*month = 3; *fulltime = *fulltime - sec_day *(     31+29   );} else
 
if(*fulltime < (sec_day * (31+29+31+30))  ) // проверка 4 месяца ВИСОКОСНОГО ГОДА  30
{*month = 4; *fulltime = *fulltime - sec_day *(     31+29+31    );} else
 
if(*fulltime < (sec_day * (31+29+31+30+31))  ) // проверка 5 месяца ВИСОКОСНОГО ГОДА   31
{*month = 5; *fulltime = *fulltime - sec_day *(     31+29+31+30   );} else
 
if(*fulltime < (sec_day * (31+29+31+30+31+30))  ) // проверка 6 месяца ВИСОКОСНОГО ГОДА    30
{*month = 6; *fulltime = *fulltime - sec_day *(     31+29+31+30+31  );} else
 
if(*fulltime < (sec_day * (31+29+31+30+31+30+31))  ) // проверка 7 месяца ВИСОКОСНОГО ГОДА 31
{*month = 7; *fulltime = *fulltime - sec_day *(     31+29+31+30+31+30  );} else
 
if(*fulltime < (sec_day * (31+29+31+30+31+30+31+31))  ) // проверка 8 месяца ВИСОКОСНОГО ГОДА  31
{*month = 8; *fulltime = *fulltime - sec_day *(     31+29+31+30+31+30+31  );} else
 
if(*fulltime < (sec_day * (31+29+31+30+31+30+31+31+30))  ) // проверка 9 месяца ВИСОКОСНОГО ГОДА   30
{*month = 9; *fulltime = *fulltime - sec_day *(     31+29+31+30+31+30+31+31  );} else
 
if(*fulltime < (sec_day * (31+29+31+30+31+30+31+31+30+31))  ) // проверка 10 месяца ВИСОКОСНОГО ГОДА   31
{*month = 10; *fulltime = *fulltime - sec_day *(    31+29+31+30+31+30+31+31+30  );} else
 
if(*fulltime < (sec_day * (31+29+31+30+31+30+31+31+30+31+30))  ) // проверка 11 месяца ВИСОКОСНОГО ГОДА    30
{*month = 11; *fulltime = *fulltime - sec_day *(    31+29+31+30+31+30+31+31+30+31);} else
 
if(*fulltime < (sec_day * (31+29+31+30+31+30+31+31+30+31+30+31))  ) // проверка 12 месяца ВИСОКОСНОГО ГОДА 31
{*month = 12; *fulltime = *fulltime - sec_day *(    31+29+31+30+31+30+31+31+30+31+30  );} 
            } 
/////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////У НАС ЕСТЬ "ОСТАТКИ" СЕКУНД, найдем дни, часы, минуты и секунды /////////////////////////////////////////////
 
*day= *fulltime / sec_day ;  // целое от деления и будет наши волчьи дни (в дне 86400 секунд)
*fulltime = *fulltime % sec_day; 
*hour = *fulltime / 3600;   //наши часы по UTC +00 
*fulltime = *fulltime % 3600;
*min = *fulltime / 60;  //минуты
*sec = *fulltime % 60;  //секунды
}
 
 
 
int main() {
setlocale (LC_ALL, "");
 
time_t fulltime;
fulltime = time (NULL);
 
int year = 0;
int month = 0;
int day = 0;
int hour = 0; 
int min = 0; 
int sec = 0;
bool visokos_year = false; 
 
 
my_time (&(long long)fulltime , &year, &month, &day, &hour, &min, &sec, &visokos_year);
 
 
cout << day <<" день "<< month <<" месяц "  << year << " год "  <<endl;
cout << hour << "-" << min << "-" << sec << endl;
cout << "флаг високосного года "<< visokos_year <<endl;
 
 
cout << endl;
system ("pause");
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2015, 21:19
Ответы с готовыми решениями:

Перевод времени из минут и секунды в секунды
Всем привет! Помогите с контрольными по С++, Я пока не совсем понимаю этот язык. Заранее Спасибо!...

Перевод времени в секунды
есть время формата hh:mm:ss типо 14:01:08 Как перевести это в секунды я пробовал так но выводит...

Перевод времени в секунды
Здравствуйте, мне нужна помощь по переводу интервала времени в секунды. Написать функцию,...

Перевод времени в секунды
Здравствуйте. ломаю голову со следующей задачей: вводится дробное число, например 6.3, в...

4
Заблокирован
08.06.2015, 01:53 2
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 <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(void) /* C89 ANSI */
{
    time_t t;
    struct tm parts, *p;
    char date[100];
    
    time(&t);
    
    p = localtime(&t);
    
    if (p != NULL)
        parts = *p;
    
    printf("%s", asctime(&parts));
    
    strftime(date, sizeof date, "%d.%m.%Y", &parts);
    
    printf("%s" "\n", date);
    
    exit(EXIT_SUCCESS);
}
Посмотри на это)
0
0 / 0 / 0
Регистрация: 12.04.2014
Сообщений: 21
08.06.2015, 02:21 3
addas, слушай, так на код и надо ругаться, ты алгоритм то придумай, а не ставь условие на каждый год,
я даже не стану в нем разбираться, по-моему все можно написать компактно и грамотно и без готовых функций, потрудись немножко, потом скинь сюда посмотрю
0
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 3
08.06.2015, 15:18  [ТС] 4
Послушал совет и немного упростил код. Заменил счетчик, который считал каждый 4 год на арифметическую проверку условия високосного года (взял из вики), но все равно! программа считает на день меньше =((( я уже на листочке посчитал и в калькуляторе проверил... все равно на день меньше выходит :`(
цикл while(1) заменил на этот :
while (1)
{
if ( ( !(*year % 4) && (*year % 100) ) || !(*year % 400) ) //високосный год это года: либо он кратен 4, но при этом не кратен 100, либо кратен 400
{
if (*fulltime > (60*60*24*366)) //если можно отнять целый ВИСОКОСНЫЙ год, тогда отнимает, если нет, тогда выходим с флагом
*fulltime = *fulltime - (60*60*24*366);
else { *visokos_year = true; break;}
}
else
if (*fulltime > (60*60*24*365)) //если можно отнять целый НОРМАЛЬНЫЙ год, тогда отнимает, если нет, тогда выходим с флагом
*fulltime = *fulltime - (60*60*24*365);
else {*visokos_year = false; break;}
(*year) ++;
}

П.С. я конечно понимаю, что есть куча готовых функций которые выводят дату в любом формате, но просто мне не ясно ГДЕ в такой простой, арифметической программе, банальная ошибка ...
0
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 3
11.06.2015, 13:23  [ТС] 5
Переставил время в часах ос на первое число, а программа показала 0 )) Дни в месяце начинаются не с нуля, а с единицы ) надо просто отнять один день =)Простая проблема - простое решение :

(sec_day * (31+28-1)) ) // проверка 2 месяца НОРМАЛЬНО ГОДА 28
{*month = 2; *fulltime = *fulltime - sec_day * ( 31-1 );} else
0
11.06.2015, 13:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2015, 13:23
Помогаю со студенческими работами здесь

Перевод времени из минут в секунды
Доброго времени суток! Проблема в том, что использую таймер, высчитывающий миллисекунды и секунды,...

Перевод времени из минут и секунд в секунды
Здравствуйте может кто-нибудь помочь мне проверить, где ошибка в этом коде, или если у него много...

Осуществить перевод времени из минут в секунды
Доброго времени суток! Нужно осуществить перевод времени из минут в секунды, задача сама по себе...

Минуты и секунды перевести в секунды и в ISO 8601 формат времени
Добрый день/вечер/утро ув. знатоки php. Возник вопрос: time содержит в себе длительность (минуты и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru