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

Нужно посчитать количество дней между всеми диапазонами и суммировать. А после это вывести столько то лет, столько то месяцев, столько то дней.
я считал с помощью функции DateDiff("d", "дата_1", "дата2") и потом все суммировал
но потом нужно перевести в годы и месяцы. Я не знаю, как учитывать високосный год. А мне надо предельно точно. Подскажите, пожалуйста, как можно сделать. Может есть какие-либо другие стандартные функции?
...
Рейтинг: 0 / 0
17.12.2009, 12:55
    #36371311
qwrqwr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу между датами
...
Рейтинг: 0 / 0
17.12.2009, 14:41
    #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
17.12.2009, 16:43
    #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
17.12.2009, 17:53
    #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
25.12.2009, 12:34
    #36386260
crash-msch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить разницу между датами
Спасибо, функция вообще классная )))
Всё сделал, хотя по сути функция всё сделала ))
Ещё раз спасибо всем за помощь
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Получить разницу между датами / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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