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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
#1

Перевод дней в дату. - C++

01.04.2012, 01:34. Просмотров 3859. Ответов 15
Метки нет (Все метки)

У меня задача, написать функцию, в которую я подаю секунды, а мне выводиться дата.

Количество секунд, предположим: 63492498494.
Я должен вывести дату в формате: 2011-12-30 21:08:14

Часы, минуты, секунды посчитал. И у меня осталось 734866 дней.
Что с ними делать ? Циклы не предлагать.

Есть мысль поделить на 365, получить 2013 год и 167 месяцев, потом посчитать количество високосных лет (функция уже есть) но параметр будет 2013, а не 2011, как мне хотелось бы, будет ошибка....

Подскажите как решить эту нетривиальную проблему.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2012, 01:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перевод дней в дату. (C++):

Функция, принимающая на вход дату рождения и текущую дату, и вычисляющая число дней до дня рождения - C++
помогите сделать работу по с++ Создать функцию, которая принимает на вход дат рождения и текущую дату и вычисляет кол-во дней до дня...

Увеличить дату на n дней - C++
Нужно увеличить дату в формате dd.mm.yy на n дней. 28 и 29 днями в феврале пренебречь. Не могу придумать алгоритм для программы, нужно...

Как увеличить дату на 10 дней? - C++
Я начинающий программист, это наброски на курсовую, без понятия как корректно и оригинально ее оформить =_= Помогите, будьте няшами ^_^ ...

Вывести дату которая наступит через N дней - C++
Здравствуйте! Не могли бы вы предоставить какие то новые решения ниже предоставленной задачке. Буду очень рад всем решениям. Сама...

Как проверить полученную дату в промежутке от 20 до 25 дней - C++
Я наконец то нашел функцию для работы со временем но встала проблема как проверить полученную дату в промежутке от 20 до 25?(Дата только...

По заданным дню и месяцу определить дату предыдущего и следующего дней - C++
Дата некоторого дня определяется двумя натуральными числами m (порядковый номер месяца) и n (число). По заданным n и m определить: (а)...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
01.04.2012, 01:40 #2
C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <iostream>
#include <time.h>
 
int main()
{
    time_t epch = 0x45d732f6;;
    printf("0x%x -> %s", epch, asctime(gmtime(&epch)));
    system("pause");
    return 0;
}
0
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 01:55  [ТС] #3
спасибо конечно, но это чит, так нельзя, нам нужно вручную костыли строить.
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
01.04.2012, 02:31 #4
C++
1
2
3
4
5
6
7
int year(int *days)
{
 int god=1970;
 int years_=*days/(365*3+366);
 *days=*days%(365*3+366);
 int years=*days/365;
 if (years<=2) { *days=*days%365; god=god+years_+years; return god; }
Вот начал что-то писать, но мозг уже не варит. До конца уже не могу сегодня дописать этот быдлокод, пойду спать надо придумать эффективный алгоритм.
0
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 02:46  [ТС] #5
Каждый 4-ый год високосный.
Каждый 100-ый год не високосный.
Каждый 400-ый год високосный.


Итого. Високосных = 1/4 + 1/400 - 1/100 = 0.2425

Можно было бы поделить дни на 365.2425, но ПРОБЛЕМААА !! Что-то мне подсказывает, что первым високосным годом был год 1600.
0
Joeymax
891 / 286 / 39
Регистрация: 31.03.2012
Сообщений: 759
01.04.2012, 03:43 #6
Високосные года были введены еще Гаем Юльевичем, а вот папа Гриша действительно в 16-м веке провел реформу, относительно годов кратных 100 и 400. см здесь
0
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 03:53  [ТС] #7
у меня открыта эта страничка....в общем, тогда делим на 365.2425, получаем 2011, всё по плану.

остаток исчез.
не могу получить остаток от деления на 365.2425, потому как Нельзя получить остаток от деления double на double.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void perevod (int64_t sec)
{
    int64_t sekundy = sec;
    long long int y, m, d, h, mi, s;
    int vis;
    s = sekundy % 60;
    sekundy /= 60;
    mi = sekundy % 60;
    sekundy /=60;
    h = sekundy % 24;
    sekundy /= 24;
    cout << sekundy << endl;
    y = sekundy / 365.2425;
    double helphelp = sekundy;
    helphelp = (helphelp % 365.2425);
}
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
01.04.2012, 04:10 #8
Цитата Сообщение от Allpodo Посмотреть сообщение
Количество секунд, предположим: 63492498494.
Я должен вывести дату в формате: 2011-12-30 21:08:14
Это Вы откуда такие числа взяли?
C
1
2
3
4
5
6
7
#include <stdio.h>
#include <time.h>
 
int main(void){
    printf("%lu\n", time(NULL));
    return 0;
}
Код
$ ./now_seconds 
1333238279
А сейчас, замечу, 2012 год. То есть ваши 63492498494 секунд с 1 января 1970 года - не знаю, на сколько светлое, но весьма далёкое будущее. Или это от рождества Христова, или ещё от какой-то знаменательной даты? А так у Nekto правильный ход мысли, только там ещё массив с количеством дней по месяцам заводить прийдётся... Морока, короче.


Цитата Сообщение от Allpodo Посмотреть сообщение
Каждый 100-ый год не високосный.
Каждый 400-ый год високосный.
Дао в том, чтобы не замутнять рассудок лишними знаниями. С 1970 года 50 лет ещё не прошло. Учитывая, что первым начиная с 1970 был 1972 год, не сложно посчитать сколько их, високосных было. Но только оно не нужно. Проще найти количество четырёхлетних периодов
Цитата Сообщение от Nekto Посмотреть сообщение
int years_=*days/(365*3+366);
вроде того...
0
Cool-T
20 / 13 / 1
Регистрация: 17.12.2010
Сообщений: 34
01.04.2012, 04:24 #9
Цитата Сообщение от Allpodo Посмотреть сообщение
потому как Нельзя получить остаток от деления double на double.
Так дели инт на дабл :]
int x = 21;
double y = 3.9;
double z = x%y; // z = 1.5

Добавлено через 6 минут
Цитата Сообщение от easybudda Посмотреть сообщение
Морока, короче.
Насколько я понял у него другая задача.
Например, пользователь ввел 2 миллиарда секунд, и узнал, сколько это лет, месяцев, дней, часов, минут и секунд :]

Не по теме:

Эх вроде бы 2 миллиарда секунд не так много кажется, а это больше 60 лет :[

0
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 04:36  [ТС] #10
я почти справился с данной функцией.
у меня задача перегрузить много разных операторов. сейчас работаю над "+"


C++
1
2
3
4
CDateTime   a;
a = "2011-12-30 21:08:14";
a = a + 259200;
cout << a; // 2012-01-02 21:08:14
с днями решил разбираться так:

y = sekundy / 365.2425;
int64_t helphelp = sekundy;
helphelp = sekundy - (y * 365.2425);

Добавлено через 7 минут
не катит деление не 365.2425.
потерял 1 день.
получилось 2011-12-29 21:8:14 вместо 2011-12-30 21:08:14
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
01.04.2012, 04:41 #11
Цитата Сообщение от Cool-T Посмотреть сообщение
Например, пользователь ввел 2 миллиарда секунд, и узнал, сколько это лет, месяцев, дней, часов, минут и секунд
В этом смысле... Как-то привычнее уже время в секундах с 01.01.1970 измерять... Ну тогда всё ещё проще:
734866 / 1461 х 4 = 2008
в остатке 1444 дня. Грубо на 365 - 3 года, плюс 2008 - 2011 год, осталось опять же с месяцами разобраться...
0
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 05:10  [ТС] #12
Цитата Сообщение от easybudda Посмотреть сообщение
734866 / 1461 х 4 = 2008
в остатке 1444 дня. Грубо на 365 - 3 года, плюс 2008 - 2011 год, осталось опять же с месяцами разобраться...
Тогда ещё 1 функцию писать, которая будет делать перерасчёт лет....спасибо за цифры, буду шаманить.

Добавлено через 22 минуты
echo $(((734866*4)%1461))

остаток 1393. это 3 года и 298 дней, а у нас 364 должно получиться
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
01.04.2012, 05:41 #13
Цитата Сообщение от Allpodo Посмотреть сообщение
734866*4
здесь-то зачем на 4 умножать?
Код
$ perl -e "print ( 734866 % 1461 );"
1444
это отсаток в прелелах 4 лет...
0
Joeymax
891 / 286 / 39
Регистрация: 31.03.2012
Сообщений: 759
01.04.2012, 07:16 #14
Цитата Сообщение от Allpodo Посмотреть сообщение
у меня открыта эта страничка....в общем, тогда делим на 365.2425, получаем 2011, всё по плану.
Нет, нет, нет! не надо! Во-первых, определитесь от какой точки (времени) идет отсчет,
вот NEKTO, начинает отсчет от 1 января 1970 года 0 часов 00 минут. Впрочем, даю наВодку, и localtime и gmtime ведут отсчет от начала эпохи.
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
01.04.2012, 12:57 #15
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
#include <time.h>
#include <iostream>
time_t year(time_t *days, time_t *vis)
{
 time_t god=1970;
 *vis=0; 
 time_t years_=*days/(365*3+366)*4;
 *days=*days%(365*3+366);
 if (*days<365)
  {
   god=god+years_; return god;
  }
 else
 if (*days<365*2)
  {
   god=god+years_+1; *days-=365; return god;
  }
 else
 if (*days<365*2+366)
  {
   god=god+years_+2; *days-=365*2; *vis=1; return god;
  }
 else
  {
   god=god+years_+3; *days-=365*2+366; return god;
  }
}
 
int main()
{
    time_t epch = time(NULL);
    printf("0x%x -> %s", epch, asctime(gmtime(&epch)));
    time_t V, D, Y;
    D=epch/(60*60*24);
    Y=year(&D,&V);
    printf("\nYear - %ld, days left - %ld",Y,D);
    if (V==0) (" Nevisokosniy\n"); else printf(" Visokosniy\n");
    system("pause");    
}
Добавлено через 1 час 33 минуты
быдлокод стал еще больше Теперь считает дату.
код
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
#include <time.h>
#include <iostream>
time_t year(time_t *days, time_t *vis)
{
 time_t god=1970;
 *vis=0; 
 time_t years_=*days/(365*3+366)*4;
 *days=*days%(365*3+366);
 if (*days<365)
  {
   god=god+years_; return god;
  }
 else
 if (*days<365*2)
  {
   god=god+years_+1; *days-=365; return god;
  }
 else
 if (*days<365*2+366)
  {
   god=god+years_+2; *days-=365*2; *vis=1; return god;
  }
 else
  {
   god=god+years_+3; *days-=365*2+366; return god;
  }
}
int month(time_t *days, time_t vis)
{
 if (*days<31) { *days+=1; return 1; }
 else
 if (*days<31+28+vis) {*days-=31; *days+=1; return 2; }
 else
 if (*days<59+vis+31) {*days-=(31+28+vis); *days+=1; return 3; }
 else
 if (*days<90+vis+30) {*days-=(90+vis); *days+=1; return 4; } 
 else
 if (*days<120+vis+31) {*days-=(120+vis); *days+=1; return 5; }
 else
 if (*days<151+vis+30) {*days-=(151+vis); *days+=1; return 6; }
 else
 if (*days<181+vis+31) {*days-=(181+vis); *days+=1; return 7; } 
 else
 if (*days<212+vis+31) {*days-=(212+vis); *days+=1; return 8; }  
 else
 if (*days<243+vis+30) {*days-=(243+vis); *days+=1; return 9; } 
 else
 if (*days<273+vis+31) {*days-=(273+vis); *days+=1; return 10; }
 else
 if (*days<304+vis+30) {*days-=(304+vis); *days+=1; return 11; }
 else {*days-=(334+vis); return 12; }
}
int main()
{
    time_t epch = time(NULL);
    printf("0x%x -> %s", epch, asctime(gmtime(&epch)));
    time_t V, D, Y;
    D=(time(NULL))/(60*60*24);
    Y=year(&D,&V);
    printf("\nYear - %ld, days left - %ld",Y,D);
    if (V==0) (" Nevisokosniy\n"); else printf(" Visokosniy\n");
    int M;
    M=month(&D,V);
    printf("\n%d/%d/%d\n",D,M,Y);
    system("pause");    
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 12:57
Привет! Вот еще темы с ответами:

С некоторой даты по настоящий день прошло n дней, найти неизвестную дату - C++
С некоторой даты по настоящий день прошло n дней, найти неизвестную дату.

Дана дата в формате день:месяц:год. Определить дату через n дней - C++
Дана дата в формате день:месяц:год. Определить дату через n дней. Помогите написать программу, желательно полный код.

Перевод строки в дату - C++
Вопрос: есть строка &quot;2013-06-28 19:00:00.000&quot;. Как её привести к типу дата? Нужно для последующего сравнения.

Вывести число дней в заданном году, учитывая, что обычный год насчитывает 365 дней, а високосный — 366 дней - C++
11 Дан номер некоторого года (положительное целое число). Вывести число дней в этом году, учитывая, что обычный год насчитывает 365 дней, а...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.04.2012, 12:57
Ответ Создать тему
Опции темы

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