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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 01:34     Перевод дней в дату. #1
У меня задача, написать функцию, в которую я подаю секунды, а мне выводиться дата.

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

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

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

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

C++ Как увеличить дату на 10 дней?
Как проверить полученную дату в промежутке от 20 до 25 дней C++
Вывести число дней в заданном году, учитывая, что обычный год насчитывает 365 дней, а високосный — 366 дней C++
C++ Написать программу, которая предлагает пользователю ввести дату в формате YYYY MM DD и выводит в консоль, следующую за ней дату
Перевод строки в дату C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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;
}
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 01:55  [ТС]     Перевод дней в дату. #3
спасибо конечно, но это чит, так нельзя, нам нужно вручную костыли строить.
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; }
Вот начал что-то писать, но мозг уже не варит. До конца уже не могу сегодня дописать этот быдлокод, пойду спать надо придумать эффективный алгоритм.
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.
Joeymax
883 / 278 / 39
Регистрация: 31.03.2012
Сообщений: 743
01.04.2012, 03:43     Перевод дней в дату. #6
Високосные года были введены еще Гаем Юльевичем, а вот папа Гриша действительно в 16-м веке провел реформу, относительно годов кратных 100 и 400. см здесь
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);
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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);
вроде того...
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 лет :[

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
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.04.2012, 04:41     Перевод дней в дату. #11
Цитата Сообщение от Cool-T Посмотреть сообщение
Например, пользователь ввел 2 миллиарда секунд, и узнал, сколько это лет, месяцев, дней, часов, минут и секунд
В этом смысле... Как-то привычнее уже время в секундах с 01.01.1970 измерять... Ну тогда всё ещё проще:
734866 / 1461 х 4 = 2008
в остатке 1444 дня. Грубо на 365 - 3 года, плюс 2008 - 2011 год, осталось опять же с месяцами разобраться...
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 должно получиться
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.04.2012, 05:41     Перевод дней в дату. #13
Цитата Сообщение от Allpodo Посмотреть сообщение
734866*4
здесь-то зачем на 4 умножать?
Код
$ perl -e "print ( 734866 % 1461 );"
1444
это отсаток в прелелах 4 лет...
Joeymax
883 / 278 / 39
Регистрация: 31.03.2012
Сообщений: 743
01.04.2012, 07:16     Перевод дней в дату. #14
Цитата Сообщение от Allpodo Посмотреть сообщение
у меня открыта эта страничка....в общем, тогда делим на 365.2425, получаем 2011, всё по плану.
Нет, нет, нет! не надо! Во-первых, определитесь от какой точки (времени) идет отсчет,
вот NEKTO, начинает отсчет от 1 января 1970 года 0 часов 00 минут. Впрочем, даю наВодку, и localtime и gmtime ведут отсчет от начала эпохи.
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");    
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 13:51     Перевод дней в дату.
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Allpodo
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 13:51  [ТС]     Перевод дней в дату. #16
Я уже писал ранее, что time.h использовать нельзя.
И время надо считать от Рождества Христова.

Добавлено через 21 минуту
Не вариант здесь вот такие операции производить:
y = sekundy / 1461 * 4;
sekundy = (sekundy % 1461);

Нам могут дать дату 1600-ый год, 1900-ый итд
Yandex
Объявления
01.04.2012, 13:51     Перевод дней в дату.
Ответ Создать тему
Опции темы

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