datetime — c ++ получает годы между датой, выбранной пользователем, и фактической датой (считая дни, месяцы, годы)

я пытался сделать это:

struct Den_t
{
int day, month, year;
};

int main()
{
struct Den_t* Datum = new struct Den_t;
struct Den_t* Dnes = new struct Den_t;

time_t theTime = time(NULL);
struct tm aTime;
localtime_s(&aTime, &theTime);

Dnes->day = aTime.tm_mday;
Dnes->month = aTime.tm_mon + 1;
Dnes->year = aTime.tm_yday + 1900;

cin >> Datum->day >> Datum->month >> Datum->year;
if (Dnes->year - Datum->year >= 18 )
cout << "full aged " << endl;
else
cout << "not full aged " << endl;
system("PAUSE");
return 0;
}

но я как-то не могу понять что я должен даже сравнить и уменьшить,может кто-нибудь объяснить мне

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

1

Решение

Используя эти библиотеки:

http://howardhinnant.github.io/date/date.html

http://howardhinnant.github.io/date/tz.html

Вот как бы я решил эту проблему. Сначала код, затем объяснение:

#include "tz.h"#include "date.h"#include <iostream>

int
main()
{
using namespace date;
using namespace std::chrono;
std::cout << "Enter birthday [day month year]:";
int di, mi, yi;
std::cin >> di >> mi >> yi;
if (std::cin.fail())
{
std::cout << "Invalid date\n";
return 1;
}
auto y = year{yi};
if (!y.ok())
{
std::cout << "Invalid year\n";
return 1;
}
auto m = month(mi);
if (!m.ok())
{
std::cout << "Invalid month\n";
return 1;
}
auto d = day(di);
if (!d.ok())
{
std::cout << "Invalid day\n";
return 1;
}
auto birthday = y/m/d;
if (!birthday.ok())
{
std::cout << "Invalid birthday\n";
return 1;
}
auto local_time = current_zone()->to_local(system_clock::now());
auto today = year_month_day{floor<days>(local_time)};
auto age = today.year() - birthday.year();
if (birthday + age > today)
--age;
if (age >= years{18})
std::cout << "full aged at " << age.count() << "\n";
else
std::cout << "not full aged at " << age.count() << "\n";
}

Сначала я хотел бы проверить, правильно ли введен пользовательский ввод. То, что у меня ниже, выглядит как минимум:

  • Это должен быть интегральный вход.
  • Каждый интегральный вход должен иметь разумное значение (например, месяц должен быть в диапазоне [1, 12]).
  • Комбинация y / m / d должна быть действительной датой.

Более надежная программа может дать пользователю некоторую обратную связь о том, что он вводит, и дать ему еще один шанс исправить свою ошибку.

Убедившись, что у нас действительный день рождения, нам нужно узнать текущую дату в местном часовом поясе. Это:

auto local_time = current_zone()->to_local(system_clock::now());

получает местное время.

Это местное время можно преобразовать в местный год, месяц и день с помощью:

auto today = year_month_day{floor<days>(local_time)};

Это вычисление следует обычаю, когда ваш день рождения начинается в местную полночь, независимо от того, в какое время суток (и где на планете) вы действительно родились. Другими словами, после установления местного года / месяца / дня эта проблема не зависит от местного часового пояса и даже от местного времени дня.

Далее вычисляется текущий возраст:

auto age = today.year() - birthday.year();
if (birthday + age > today)
--age;

Разница между сегодняшними годами и днем ​​рождения — это первое приближение к возрасту. Это приближение уточняется путем вычисления даты, на которую выпадает ваш день рождения. в этом году. Если день рождения в этом году еще впереди, то по традиции мы считаем это на год моложе. Если бы мы делали что-то, что меньше зависело от правовой системы, а больше от научной работы, мы могли бы хорошо рассчитать другие способы, такие как округление до ближайшего года (также легко сделать с этой библиотекой).

Если день рождения 29 февраля, вышеуказанный код все еще работает: birthday + age приведет (с вероятностью 75%) к неверной дате, например: февраль / 29/2015. Однако эта недействительная дата будет правильно сравниваться больше, чем 28 февраля 2015 года и меньше, чем 1 марта 2015 года, именно так, как нам нужно! Неправильные даты — ваш друг, а не враг — вы просто должны знать, что они существуют, и что с ними делать.

Теперь просто сообщить о своих выводах:

if (age >= years{18})
std::cout << "full aged at " << age.count() << "\n";
else
std::cout << "not full aged at " << age.count() << "\n";
0

Другие решения

У вас есть проблема с вашей логикой кода здесь.
Например:

Datum is 31/12/1982
Dnes is 01/01/2000

Разница в возрасте 18 лет, но возраст 17 и 2 дня.

Подумайте об использовании стандартных библиотечных функций вместо изобретения колеса.
difftime может быть полезным, например

Это очень грязный пример, но он сделает работу:

   time_t dnes;
time(&dnes);

// Set datum here ...
cin >> Datum->day >> Datum->month >> Datum->year;
datum.tm_mday = Datum->day;
datum.tm_mon =  Datum->month - 1;
datum.tm_yday = Datum->year - 1900;

datum->tm_yday+=18;

if (difftime(dnes, mktime(&datum)) <0 )
cout << "not full aged " << endl;
else
cout << "full aged " << endl;
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector