10 апреля 2015
Кравченко Виктор

Как узнать количество полных лет/месяцев/дней между двумя датами

VB.NET Полезные функции
01

Дни, минуты, секунды...

Если мы говорим о временном интервале измеряемом в днях, минутах, секундах и т. д., то здесь все достаточно просто. Нужно просто воспользоваться методом Subtract объекта DateTime, который вернет результат в виде структуры TimeSpan, описывающей временной интервал.

02

Далее — вызываем одно из необходимых свойств: Days, Hours, Minutes, Seconds, Milliseconds и получаем необходимое значение:

03 VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Main() Dim date1 As DateTime = New DateTime(2000, 12, 1, 12, 30, 0) Dim date2 As DateTime = New DateTime(2015, 5, 6, 10, 35, 16) Dim interval As TimeSpan = date2.Subtract(date1) Console.WriteLine("Value of TimeSpan: {0}", interval) Console.WriteLine("{0:N5} days, as follows:", interval.TotalDays) Console.WriteLine(" Days: {0,4}", interval.Days) Console.WriteLine(" Hours: {0,4}", interval.Hours) Console.WriteLine(" Minutes: {0,4}", interval.Minutes) Console.WriteLine(" Seconds: {0,4}", interval.Seconds) Console.WriteLine(" Milliseconds: {0,4}", interval.Milliseconds) End Sub
'Value of TimeSpan: 5268.22:05:16 '5 268,92032 days, as follows: ' Days: 5268 ' Hours: 22 ' Minutes: 5 ' Seconds: 16 ' Milliseconds: 0
04 На заметку:
Разница между свойствами TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds и Days, Hours, Minutes, Seconds, Milliseconds заключается в том, что, например, свойство Days (тип Integer) вернет количество полных дней полученного интервала, в то время, как свойство TotalDays (тип Double) вернет весь временной интервал выраженный в днях и их долях.
05

Годы

С годами сложнее.

06 На заметку:
В году 365,25 дней. Поэтому каждый 4 год — високосный — 366 дней, вместо обычных 365 дней, для того, чтобы компенсировать четверть дня в каждом году:
(365 + 365 + 365 + 366 (високосный)) / 4 = 365,25
07

Лирическое отступление — вспомним, что большинство задач связанных с определением количества лет между двумя датами сводится к определению возраста человека. И если человек родился 1 января 1990 года в 10:23:00, то полных 25 лет ему наступит 1 января 2015 года в 10:23:01.

08

Правильный, «академический» метод будет заключаться в использовании стандартных методов и свойств:

09 VB.NET
1
2
3
4
5
6
7
8
9
Dim date1 As DateTime = New DateTime(1990, 1, 1, 10, 23, 0) Dim date2 As DateTime = New DateTime(2015, 1, 1, 10, 23, 1) Dim interval As TimeSpan = date2.Subtract(date1) Dim age As Integer = CInt(interval.TotalDays / 365.25) Console.WriteLine(String.Format("age:{0}, totaldays/365.25 - {1}", age, interval.TotalDays / 365.25)) ' age:25, interval/365.25: 24,9993155689913
10

Некоторые из вас, не заподозрив подвоха скажут — все верно, но... попробуйте изменить date2 — на 2 минуты раньше, т.е. формально полных 25 лет ещё не будет, но:

11 VB.NET
1
2
3
4
Dim date1 As DateTime = New DateTime(1990, 1, 1, 10, 23, 0) Dim date2 As DateTime = New DateTime(2015, 1, 1, 10, 22, 59)
' ... ' age:25, interval/365.25: 24,9993155056151
12

В этом месте ряды «некоторых» из предыдущего абзаца пополнятся — мол, я придираюсь, но придется парировать:

13 VB.NET
1
2
3
4
Dim date1 As DateTime = New DateTime(1990, 1, 1, 10, 23, 0) Dim date2 As DateTime = New DateTime(2014, 10, 1, 10, 23, 0) ' Дата меньше на 3 месяца от дня рождения
' ... ' age:25, interval/365.25: 24,7474332648871
14

Можно конечно начать работать с цифрами после запятой, но это уже занятие неблагодарное, поэтому предлагаю свою функцию — банальную и простую:

15 VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sub Main() For sec As Integer = 22 To 24 Dim date1 As DateTime = New DateTime(1990, 1, 1, 10, 23, 0) Dim date2 As DateTime = New DateTime(2015, 1, 1, 10, sec, 0) Dim age As Integer = ПолучитьВозраст(date1, date2) Console.WriteLine(String.Format("age:{0}, date2: {1}", age, date2.ToString)) Next End Sub
Function ПолучитьВозраст(dateStart As DateTime, dateEnd As DateTime) As Integer If dateStart.DayOfYear < dateEnd.DayOfYear Or _ dateStart.DayOfYear = dateEnd.DayOfYear And dateStart.TimeOfDay < dateEnd.TimeOfDay Then Return dateEnd.Year - dateStart.Year Else Return dateEnd.Year - dateStart.Year - 1 End If End Function
' age:24, date2: 01.01.2015 10:22:00 ' age:24, date2: 01.01.2015 10:23:00 <- пока ещё рано ' age:25, date2: 01.01.2015 10:24:00 <- а сейчас в самый раз
16

Месяцы

На удивление с месяцами, все ещё сложнее. Сложно на вскидку привести пример задачи, которая бы требовала расчета количества полных месяцев. Расчет усугубляется ещё и тем, что месяц величина крайне непостоянная — и его длина может варьироваться от 28 до 31 дня.

17

С одной стороны, можно определить для задачи константу — в месяце 30,5 дней, с другой — придумать алгоритм расчета (сколько в месяце попугаев). В любом случае зависит от задачи, которую необходимо решить. Выше информации предостаточно.

19

Похожие запросы:

  • Функция определения полных лет со дня рождения
  • Вычисление разницы в годах между двумя датами
  • Как вычислить разницу в годах между двумя датами
  • Вычислить количество полных лет, прошедших между двумя датами
  • Разница между датами
  • Количество полных лет между датами
  • Как определить количество лет , месяцев и дней между двумя датами
comments powered by HyperComments