Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/65: Рейтинг темы: голосов - 65, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54

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

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

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

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

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

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

Подскажите как решить эту нетривиальную проблему.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2012, 01:34
Ответы с готовыми решениями:

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

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

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

15
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
01.04.2012, 01:40
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  [ТС]
спасибо конечно, но это чит, так нельзя, нам нужно вручную костыли строить.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
01.04.2012, 02:31
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  [ТС]
Каждый 4-ый год високосный.
Каждый 100-ый год не високосный.
Каждый 400-ый год високосный.


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

Можно было бы поделить дни на 365.2425, но ПРОБЛЕМААА !! Что-то мне подсказывает, что первым високосным годом был год 1600.
0
1234 / 424 / 107
Регистрация: 31.03.2012
Сообщений: 1,159
01.04.2012, 03:43
Високосные года были введены еще Гаем Юльевичем, а вот папа Гриша действительно в 16-м веке провел реформу, относительно годов кратных 100 и 400. см здесь
0
0 / 0 / 0
Регистрация: 14.08.2011
Сообщений: 54
01.04.2012, 03:53  [ТС]
у меня открыта эта страничка....в общем, тогда делим на 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Эксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
01.04.2012, 04:10
Цитата Сообщение от 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;
}
Code
1
2
$ ./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
Цитата Сообщение от 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  [ТС]
я почти справился с данной функцией.
у меня задача перегрузить много разных операторов. сейчас работаю над "+"


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Эксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
01.04.2012, 04:41
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
734866 / 1461 х 4 = 2008
в остатке 1444 дня. Грубо на 365 - 3 года, плюс 2008 - 2011 год, осталось опять же с месяцами разобраться...
Тогда ещё 1 функцию писать, которая будет делать перерасчёт лет....спасибо за цифры, буду шаманить.

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

остаток 1393. это 3 года и 298 дней, а у нас 364 должно получиться
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
01.04.2012, 05:41
Цитата Сообщение от Allpodo Посмотреть сообщение
734866*4
здесь-то зачем на 4 умножать?
Code
1
2
$ perl -e "print ( 734866 % 1461 );"
1444
это отсаток в прелелах 4 лет...
0
1234 / 424 / 107
Регистрация: 31.03.2012
Сообщений: 1,159
01.04.2012, 07:16
Цитата Сообщение от Allpodo Посмотреть сообщение
у меня открыта эта страничка....в общем, тогда делим на 365.2425, получаем 2011, всё по плану.
Нет, нет, нет! не надо! Во-первых, определитесь от какой точки (времени) идет отсчет,
вот NEKTO, начинает отсчет от 1 января 1970 года 0 часов 00 минут. Впрочем, даю наВодку, и localtime и gmtime ведут отсчет от начала эпохи.
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
01.04.2012, 12:57
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  [ТС]
Я уже писал ранее, что time.h использовать нельзя.
И время надо считать от Рождества Христова.

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

Нам могут дать дату 1600-ый год, 1900-ый итд
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.04.2012, 13:51
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru