powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Получить разницу между датами
6 сообщений из 6, страница 1 из 1
Получить разницу между датами
    #36371273
crash-msch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть диапазоны дат, например, с 10.12.2001 до 30.12.2001 потом 01.03.2003 до 1.05.2004 и т.д. количество диапазонов неизвестно

Нужно посчитать количество дней между всеми диапазонами и суммировать. А после это вывести столько то лет, столько то месяцев, столько то дней.
я считал с помощью функции DateDiff("d", "дата_1", "дата2") и потом все суммировал
но потом нужно перевести в годы и месяцы. Я не знаю, как учитывать високосный год. А мне надо предельно точно. Подскажите, пожалуйста, как можно сделать. Может есть какие-либо другие стандартные функции?
...
Рейтинг: 0 / 0
Получить разницу между датами
    #36371311
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Получить разницу между датами
    #36371624
.Михаил.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crash-msch
Я не знаю, как учитывать високосный год

вот проверка на високосный год
Код: plaintext
1.
2.
3.
4.
Dim mYear As Integer, YearIsVisokos As Boolean
mYear =  2010  ' проверяемый год
YearIsVisokos = IsDate("2/29/" & CStr(mYear))
End Sub
...
Рейтинг: 0 / 0
Получить разницу между датами
    #36372057
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чуть более точный метод (дополнительно учитывает год, кратный 4000):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function IsLeapYear(iYear As Integer) As Boolean
    If iYear Mod  4000  =  0  Then
        IsLeapYear = False
    ElseIf iYear Mod  400  =  0  Then
        IsLeapYear = True
    ElseIf iYear Mod  100  =  0  Then
        IsLeapYear = False
    ElseIf iYear Mod  4  =  0  Then
        IsLeapYear = True
    Else
        IsLeapYear = False
    End If
End Function
...
Рейтинг: 0 / 0
Получить разницу между датами
    #36372319
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Складываешь все свои интервалы, навроде:

dp = (d2-d1)+(d4-d3)+...

2. Вызываешь нижеприведенную функцию задав в качестве первого параметра #0:0#, а в качестве второго то что получил в пункте 1 - как в примере внизу...

Код: plaintext
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.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
Public Sub Main()
    Dim dp As Date, d As Variant, h As Variant
    dp = (# 12 / 2 / 2009   12 : 28 : 00  AM# - # 12 / 1 / 2009   7 : 30 : 00  AM#) + (# 12 / 7 / 2009   12 : 10 : 00  AM# - # 12 / 4 / 2009   5 : 30 : 00  PM#)

    ' Если нам надо в днях и часах
    Debug.Print DateInterval(# 12 : 00 : 00  AM#, dp, , , d, h, , , True)
    Debug.Print d, h
End Sub

' Функция получает разницу между датами в заданных полных единицах даты/времени
' При ReturnString=True возвращает строковое представление интервала
Public Function DateInterval(d1 As Date, d2 As Date, _
        Optional Years As Variant, Optional Months As Variant, Optional Days As Variant, _
        Optional Hours As Variant, Optional Minutes As Variant, Optional Seconds As Variant, _
        Optional ReturnString As Boolean = False) As String
    
    Const sr As String = ", "
    Const y As String = "yyyy", m As String = "m", d As String = "d", _
        h As String = "h", n As String = "n", s As String = "s"
    Dim dm As Date, dd As Date, dh As Date, dn As Date, ds As Date, _
        ss As String, i As Integer, sss As String, s0 As String

    If IsMissing(Years) Then
        dm = d1
    Else
        Years = DateDiff(y, d1, d2)
        dm = DateAdd(y, Years, d1)
        If dm > d2 Then
            Years = Years -  1 
            dm = DateAdd(y, Years, d1)
        End If
        If ReturnString Then
            If Years Then
                ss = Right$(Format$(Years, "00"),  2 )
                If Right$(ss,  1 ) = "0" Or Left$(ss,  1 ) = "1" Or CInt(Right$(ss,  1 )) >=  5  Then
                    sss = Years & " лет"
                Else
                    sss = Years & " год"
                    If Right$(ss,  1 ) <> "1" Then sss = sss & "а"
                End If
            Else
                s0 = "лет"
            End If
        End If
    End If
    If IsMissing(Months) Then
        dd = dm
    Else
        Months = DateDiff(m, dm, d2)
        dd = DateAdd(m, Months, dm)
        If dd > d2 Then
            Months = Months -  1 
            dd = DateAdd(m, Months, dm)
        End If
        If ReturnString Then
            If Months Then
                ss = Right$(Format$(Months, "00"),  2 )
                If Len(sss) Then sss = sss & sr
                sss = sss & Months & " месяц"
                If Right$(ss,  1 ) = "0" Or Left$(ss,  1 ) = "1" Or CInt(Right$(ss,  1 )) >=  5  Then
                    sss = sss & "ев"
                Else
                    If Right$(ss,  1 ) <> "1" Then sss = sss & "а"
                End If
            Else
                s0 = "месяцев"
            End If
        End If
    End If
    If IsMissing(Days) Then
        dh = dd
    Else
        Days = DateDiff(d, dd, d2)
        dh = DateAdd(d, Days, dd)
        If dh > d2 Then
            Days = Days -  1 
            dh = DateAdd(d, Days, dd)
        End If
        If ReturnString Then
            If Days Then
                ss = Right$(Format$(Days, "00"),  2 )
                If Len(sss) Then sss = sss & sr
                sss = sss & Days & " д"
                If Right$(ss,  1 ) = "0" Or Left$(ss,  1 ) = "1" Or CInt(Right$(ss,  1 )) >=  5  Then
                    sss = sss & "ней"
                Else
                    sss = sss & IIf(Right$(ss,  1 ) = "1", "ень", "ня")
                End If
            Else
                s0 = "дней"
            End If
        End If
    End If
    If IsMissing(Hours) Then
        dn = dh
    Else
        Hours = DateDiff(h, dh, d2)
        dn = DateAdd(h, Hours, dh)
        If dn > d2 Then
            Hours = Hours -  1 
            dn = DateAdd(h, Hours, dh)
        End If
        If ReturnString Then
            If Hours Then
                ss = Right$(Format$(Hours, "00"),  2 )
                If Len(sss) Then sss = sss & sr
                sss = sss & Hours & " час"
                If Right$(ss,  1 ) = "0" Or Left$(ss,  1 ) = "1" Or CInt(Right$(ss,  1 )) >=  5  Then
                    sss = sss & "ов"
                Else
                    If Right$(ss,  1 ) <> "1" Then sss = sss & "а"
                End If
            Else
                s0 = "часов"
            End If
        End If
    End If
    If IsMissing(Minutes) Then
        ds = dn
    Else
        Minutes = DateDiff(n, dn, d2)
        ds = DateAdd(n, Minutes, dn)
        If ds > d2 Then
            Minutes = Minutes -  1 
            ds = DateAdd(n, Minutes, dn)
        End If
        If ReturnString Then
            If Minutes Then
                ss = Right$(Format$(Minutes, "00"),  2 )
                If Len(sss) Then sss = sss & sr
                sss = sss & Minutes & " минут"
                If Not (Right$(ss,  1 ) = "0" Or Left$(ss,  1 ) = "1" Or CInt(Right$(ss,  1 )) >=  5 ) Then
                    sss = sss & IIf(Right$(ss,  1 ) = "1", "а", "ы")
                End If
            Else
                s0 = "минут"
            End If
        End If
    End If
    If Not IsMissing(Seconds) Then
        Seconds = DateDiff(s, ds, d2)
        If ReturnString Then
            If Seconds Then
                ss = Right$(Format$(Seconds, "00"),  2 )
                If Len(sss) Then sss = sss & sr
                sss = sss & Seconds & " секунд"
                If Not (Right$(ss,  1 ) = "0" Or Left$(ss,  1 ) = "1" Or CInt(Right$(ss,  1 )) >=  5 ) Then
                    sss = sss & IIf(Right$(ss,  1 ) = "1", "а", "ы")
                End If
            Else
                s0 = "секунд"
            End If
        End If
    End If
    If ReturnString Then DateInterval = IIf(Len(sss), sss, "0 " & s0)
End Function

Соответственно этой-же функцией можно вывести возраст в годах и прочее...

P.S
Когда-то давно баловался...
...
Рейтинг: 0 / 0
Получить разницу между датами
    #36386260
crash-msch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, функция вообще классная )))
Всё сделал, хотя по сути функция всё сделала ))
Ещё раз спасибо всем за помощь
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Получить разницу между датами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]