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

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

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

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

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

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

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

Подскажите как решить эту нетривиальную проблему.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2012, 01:34
Ответы с готовыми решениями:

Дана строка, содержащая дату в виде «dd.mm.yyyy». Определить дату через n дней
Что исправить нужно? #include<iostream> #include<string> using namespace std; struct date {...

Перевод количества дней в количество лет, месяцев и дней
Помогите, пожалуйста срочно нужно перевести кол-во дней(вводит пользователь) в кол-во лет, месяцев...

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

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

15
347 / 292 / 37
Регистрация: 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
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 01:55  [ТС] 3
спасибо конечно, но это чит, так нельзя, нам нужно вручную костыли строить.
0
347 / 292 / 37
Регистрация: 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
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
1177 / 419 / 106
Регистрация: 31.03.2012
Сообщений: 1,145
01.04.2012, 03:43 6
Високосные года были введены еще Гаем Юльевичем, а вот папа Гриша действительно в 16-м веке провел реформу, относительно годов кратных 100 и 400. см здесь
0
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
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
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
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
01.04.2012, 04:41 11
Цитата Сообщение от Cool-T Посмотреть сообщение
Например, пользователь ввел 2 миллиарда секунд, и узнал, сколько это лет, месяцев, дней, часов, минут и секунд
В этом смысле... Как-то привычнее уже время в секундах с 01.01.1970 измерять... Ну тогда всё ещё проще:
734866 / 1461 х 4 = 2008
в остатке 1444 дня. Грубо на 365 - 3 года, плюс 2008 - 2011 год, осталось опять же с месяцами разобраться...
0
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,755
01.04.2012, 05:41 13
Цитата Сообщение от Allpodo Посмотреть сообщение
734866*4
здесь-то зачем на 4 умножать?
Код
$ perl -e "print ( 734866 % 1461 );"
1444
это отсаток в прелелах 4 лет...
0
1177 / 419 / 106
Регистрация: 31.03.2012
Сообщений: 1,145
01.04.2012, 07:16 14
Цитата Сообщение от Allpodo Посмотреть сообщение
у меня открыта эта страничка....в общем, тогда делим на 365.2425, получаем 2011, всё по плану.
Нет, нет, нет! не надо! Во-первых, определитесь от какой точки (времени) идет отсчет,
вот NEKTO, начинает отсчет от 1 января 1970 года 0 часов 00 минут. Впрочем, даю наВодку, и localtime и gmtime ведут отсчет от начала эпохи.
0
347 / 292 / 37
Регистрация: 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
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-ый итд
0
01.04.2012, 13:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2012, 13:51
Помогаю со студенческими работами здесь

Как увеличить дату на 10 дней?
Я начинающий программист, это наброски на курсовую, без понятия как корректно и оригинально ее...

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

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

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


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

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

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