С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/32: Рейтинг темы: голосов - 32, средняя оценка - 4.91
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 85

Задача получить разницу полных лет

26.07.2009, 20:18. Показов 6221. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Надеюсь, что пригодится кому-нибудь.
И ещё вопросы, чтобы не плодить много тем
Есть 2 datetimepicker'а. Задача получить разницу полных лет из этих двух datimepicker'а. Такая функция есть в Delphi - YearsBetween, есть ли что-нибудь подобное на C#? В TimeSpan максимум только кол-во дней есть? Или рассчитывать /365 ?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.07.2009, 20:18
Ответы с готовыми решениями:

Вычислить количество дней, полных месяцев, и полных лет, прошедших между датами
Даны натуральные числа a1, b1 , c1 (число, месяц, год) a2, b2, c2 (число, месяц, год) ...

Отображение полных лет человека..
В одной строке есть две ячейки с датами, первая всегда больше второй, вторая это дата рождения человека, как в третьей ячейке отобразить...

Определите исполнилось ли пользователю полных 16 лет)
Известна текущая дата. Пользователь вводит день, месяц и год своего рождения. Написать программу определения, исполнилось или нет...

19
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
27.07.2009, 12:05
Так подойдет?
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
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        int first = 0;
        int second = 0;
 
        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            first = dateTimePicker1.Value.Year;
        }
 
        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            second = dateTimePicker2.Value.Year;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            int rez = second - first;
            label2.Text = rez.ToString();
        }
    }
Добавлено через 19 минут 16 секунд
вот переделал немного, теперь считает разницу именно полных лет
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
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        int firstM = DateTime.Now.Month;
        int secondM = DateTime.Now.Month;
        int firstY = DateTime.Now.Year;
        int secondY = DateTime.Now.Year;
 
        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            firstY = dateTimePicker1.Value.Year;
            firstM = dateTimePicker1.Value.Month;
        }
 
        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            secondY = dateTimePicker2.Value.Year;
            secondM = dateTimePicker2.Value.Month;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            int rez = (secondM > firstM) ? (secondY - firstY) : (secondY == firstY) ? 0 : (secondY - firstY - 1);
            label2.Text = rez.ToString();
        }
    }
0
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 85
27.07.2009, 14:42  [ТС]
Огромный минус программы - её погрешность. Она на целый месяц. Простой пример:
15.07.2005 - дата рождения
27.07.2009 - текущая дата.
По программе выходит, что будет 3 года, в

C#
1
(secondY - firstY - 1)
-1 лишняя

Далее, скажем

27.12.2005 - дата рождения
27.07.2009 - текущая дата

По логике, должно быть 3 года, программа выдаёт - 4, потому что работаем только с Month и Year.

Посидел - подумал и вот что придума
Может проще делать отсчёт от дней? Тогда получим минимальную погрешность, итак
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void button1_Click(object sender, EventArgs e)
        {
 
            
            double Year;
            double rez = dateTimePicker1.Value.Day + dateTimePicker1.Value.Month*30.4375 +
                         dateTimePicker1.Value.Year*365.25;
            double rez1 = dateTimePicker2.Value.Day + dateTimePicker2.Value.Month*30.4375 +
                          dateTimePicker2.Value.Year*365.25;
            if (rez>rez1)
            {
                Year = (rez - rez1)/365.25;
            }
            else
            {
                Year = (rez1 - rez)/365.25;
            }
            double rezz=Math.Floor(Year);
          
            label1.Text = rezz.ToString();
        }
Что означают загадочные цифры 365.25 и 30.4375 - среднее арифмитическое. Т.к. раз в 4 года, наступает високосный год, 30.4375 - среднее арифметическое кол-во дней в месяце за год, можно переделать в виде enum, тогда должно получиться чуть более точнее ещё с меньшей погрешностью.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
27.07.2009, 17:19
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
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        int firstY = DateTime.Now.Year;
        int secondY = DateTime.Now.Year;
        int firstD = DateTime.Now.DayOfYear;
        int secondD = DateTime.Now.DayOfYear;
 
        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            firstY = dateTimePicker1.Value.Year;
            firstD = dateTimePicker1.Value.DayOfYear;
        }
 
        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            secondY = dateTimePicker2.Value.Year;
            secondD = dateTimePicker2.Value.DayOfYear;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            int rez = (secondD >= firstD) ? (secondY - firstY) : (secondY == firstY) ? 0 : (secondY - firstY - 1);
            label2.Text = rez.ToString();
        }
    }
0
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 85
27.07.2009, 18:32  [ТС]
Не работает в том случае, если год рождения високосный, будет постоянно врать на один год.

Добавлено через 19 минут 32 секунды
Вполне разумно будет добавить проверку года для datimepicker1 перед выводом
Что-нибудь

C#
1
2
if (DateTime.IsLeapYear(dateTimePicker1.Value.Year))
rez +=1;
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
27.07.2009, 18:39
Правильно , то я ошибся . А вот так?
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
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        int firstY = DateTime.Now.Year;
        int secondY = DateTime.Now.Year;
        int firstD = DateTime.Now.DayOfYear;
        int secondD = DateTime.Now.DayOfYear;
 
        bool IsLeapYear(int year)
        {
            return (year % 4 == 0) ? true : false;
        }
 
        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            firstY = dateTimePicker1.Value.Year;
            firstD = (IsLeapYear(firstY)) ? dateTimePicker1.Value.DayOfYear - 1 : dateTimePicker1.Value.DayOfYear;
        }
 
        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            secondY = dateTimePicker2.Value.Year;
            secondD = (IsLeapYear(secondY)) ? dateTimePicker2.Value.DayOfYear - 1 : dateTimePicker2.Value.DayOfYear;
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            int rez = (secondD >= firstD) ? (secondY - firstY) : (secondY == firstY) ? 0 : (secondY - firstY - 1);
            label2.Text = rez.ToString();
        }
    }
1
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 85
27.07.2009, 18:51  [ТС]
Теперь работает. Нужно куда-нибудь скинуть это, а то судя по гугл такой вопрос задавался ни раз, но вот решения простого не было.
0
 Аватар для exe-dealer
308 / 161 / 11
Регистрация: 07.06.2009
Сообщений: 538
27.07.2009, 22:23
вообще то у DateTime и TimeSpan определен оператор -
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
27.07.2009, 22:31
exe-dealer, а кто ж спорит, ним и пользовался. Твой вариант? Хотя признаю, эта версия с багом, а вот исправления(возможно есть еще другие баги)
C#
1
2
3
4
5
6
7
8
9
10
11
        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {
            firstY = dateTimePicker1.Value.Year;
            firstD = (IsLeapYear(firstY) && dateTimePicker1.Value.DayOfYear > 59) ? dateTimePicker1.Value.DayOfYear - 1 : dateTimePicker1.Value.DayOfYear;
        }
 
        private void dateTimePicker2_ValueChanged(object sender, EventArgs e)
        {
            secondY = dateTimePicker2.Value.Year;
            secondD = (IsLeapYear(secondY) && dateTimePicker2.Value.DayOfYear > 59) ? dateTimePicker2.Value.DayOfYear - 1 : dateTimePicker2.Value.DayOfYear;
        }
0
85 / 85 / 6
Регистрация: 13.10.2008
Сообщений: 144
28.07.2009, 01:36
А так не пройдет?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public partial class Form1 : Form {
        private DateTime StartDate, EndDate;
 
        public Form1() {
            InitializeComponent();
        }
 
        private void dateTimePicker2_ValueChanged(object sender, EventArgs e) {
            StartDate = dateTimePicker1.Value;
            EndDate = dateTimePicker2.Value;
            DateTime result =
                StartDate.Add(-new TimeSpan(EndDate.Ticks));
            textBox1.Text = (result.Year - 1).ToString();
        }
    }
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
28.07.2009, 10:41
Feuer, компилировал?
C#
1
DateTime result = StartDate.Add(-new TimeSpan(EndDate.Ticks));
это что-то странно выглядит
Цитата Сообщение от ArgumentOutOfRangeException was unhandled
Прибавление или вычитание значения приводит к непредставимому значению DateTime. Имя параметра: value
0
85 / 85 / 6
Регистрация: 13.10.2008
Сообщений: 144
28.07.2009, 15:14
Разумеется компилировал. Вполне нормально выглядит: это исключение возникает, если ты вычитаешь из более ранней даты более позднюю. Т.е. по сути получается отрицательное значение DateTime, а у него MinValue равно 01.01.0001 0:00:00.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
28.07.2009, 15:30
Feuer, изобрел второй способ
0
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 85
28.07.2009, 15:45  [ТС]
Вообще-то это третий
0
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
28.07.2009, 16:13
Вот как я сделал наподобие в консоли:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Program
    {
        static void Main(string[] args)
        {
            
            Console.Write("Введите дату рождения: ");
            DateTime date = DateTime.Parse(Console.ReadLine());
            DateTime realDate = DateTime.Now;
            TimeSpan age = realDate - date;
            int Year = age.Days;
            int let = Year / 365;
            int month = (Year - (let * 365)) / 31;
            int day = Year - (let * 365) - (month * 31);
            if (day < 0) 
            {
                day = 0;
            }
            Console.WriteLine("Мне: {0} года {1} месяцев {2} дней ", let, month, day);
            Console.ReadKey();
        }
    }
Конечно, считает тоже не без погрешностей.
PS: по этому вопросу консультировался в универе с преподом. Понял, что работать с датами в C# неблагодарное занятие.
0
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
28.07.2009, 16:18
Цитата Сообщение от kirill29 Посмотреть сообщение
Конечно, считает тоже не без погрешностей.
PS: по этому вопросу консультировался в универе с преподом. Понял, что работать с датами в C# неблагодарное занятие.
Ну почему же? если не применять к ним никаких математических операций вроде деления/умножения, то очень даже благодарное
0
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 85
28.07.2009, 16:32  [ТС]
M128K145, но погрешности можно свести к минимуму, тем более требуется получить кол-во полных лет, без учета сколько дней и месяцев, поэтому математические операции вполне себя оправдывают.

kirill29, в вашем случае погрешности будут довольно-таки приличными, т.к. берёте 31 день и 365 дней в году.

*и всё-таки остановился на своём методе. Он простой и проще простого переделывается в проверку действительности паспорта (в 20 и 45 лет паспорт подлежит замене), добавкой одной переменной.
0
 Аватар для kirill29
2098 / 1263 / 173
Регистрация: 01.02.2009
Сообщений: 2,842
28.07.2009, 16:38
Цитата Сообщение от Enoa Посмотреть сообщение
kirill29, в вашем случае погрешности будут довольно-таки приличными, т.к. берёте 31 день и 365 дней в году.
Цитата Сообщение от kirill29 Посмотреть сообщение
Конечно, считает тоже не без погрешностей.
Данный код был "накидан" для сдачи в универе, для показа, что умею работать с датами. Поэтому об отладке и доведения до более точных показаний даже не думал.
0
Комбайнёр
 Аватар для MAcK
1606 / 704 / 77
Регистрация: 27.05.2008
Сообщений: 2,535
28.07.2009, 17:38
Проверяйте, где ошибся
15 строчек кода (без объявлений переменных), кто меньше?
Вложения
Тип файла: rar IT-Skyline.rar (4.2 Кб, 37 просмотров)
0
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 85
28.07.2009, 18:15  [ТС]
Ошибка в високосных годах, попробуйте ввести:

29.02.2012 - текущая дата
29.02.1984 - дата рождения

Покажет 27, должно быть 28

*и стремление не к тому, чтобы это весило 5-7 строчек (можно и на асме написать), стремимся к тому, чтобы она работала правильно
*и 15 строчек - чисто вашего кода или как?

Добавлено через 13 минут 42 секунды
В одну строчку, если удалить все пробелы, что ставить ReShaper
C#
1
2
3
4
MessageBox.Show(Convert.ToString(Math.Floor(((dateTimePicker2.Value.Day + dateTimePicker2.Value.Month*30.4375 +
                                              dateTimePicker2.Value.Year*365.25) -
                                             (dateTimePicker1.Value.Day + dateTimePicker1.Value.Month*30.4375 +
                                              dateTimePicker1.Value.Year*365.25))/365.25)));
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.07.2009, 18:15
Помогаю со студенческими работами здесь

Расчет количества полных лет в moment.js
Здравствуйте. Тестирую moment.js на количество глюков в библиотеке: let pairs = , //13 , // 0 , // 1 , // 5 ...

Авто подсчет - кол-во полных лет
Кто знает, подскажите пожалуйста мне нужно в форму ввести поле кол-во полных лет, как сделать так что бы подсчет происходил автоматически?...

Определить возраст человека (число полных лет)
Известны год и номер месяца рождения человека, а также год и номер месяца сегодняшнего дня (январь - 1 и т. д.). ОПРЕДЕЛИТЬ ВОЗРАСТ...

Определить количество полных лет по дате рождения
вводится текущая дата и дата рождения человека(число,месяц,год),определить количество полных лет

Определить возраст человека(число полных лет)
Известны год и номер месяца рождения, а также год и номер месяца сегодняшнего дня. Определить возраст человека(число полных лет). В случае...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru