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

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

01.04.2012, 01:34. Показов 13983. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru