Лет, месяцев, дней

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Лет, месяцев, дней

Сообщение blinow » 21.01.2006 (Сб) 4:56

Случайно нет ли у кого формулы расчета сколько прошло лет, месяцев, дней.
Свою потерял, помню что-то, типа 1061012-647021 получается разность и первые две цифры лет, а далее не помню.
А числа это дата наоборот. 21.01.2006 и 12.07.1964. :roll:

blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Сообщение blinow » 21.01.2006 (Сб) 5:43

Сам нашел, может кому надо, то пожалуйста. Писал очень давно, так, что не очень красиво но работает.
Код: Выделить всё
Public Function Stav(dat As Date, na_dat As Date)
  Dim ss As String
  Dim ddd As Double
  Dim na_ddd As Double
  Dim dd As String
  Dim mm As String
  Dim gg As String
  Dim w As Double
  Dim w1 As Double
  Dim wg As Integer
  Dim wm As Integer
  Dim wd As Integer
  Dim w_p As String
  Dim wg_p As String
  Dim wm_p As String
  Dim wd_p As String
  Dim i As Integer
  Dim t As Integer
  Dim prom As String
  Dim f_m As Boolean
  Dim f_d As Boolean
  Dim return_m(3) As Variant

  gg = Mid(LTrim(Str(Year(na_dat))), 3, 2)
  If Year(na_dat) > 1999 Then
    gg = "1" & gg
  End If
  mm = IIf(Month(na_dat) < 10, "00" + LTrim(Str(Month(na_dat))), "0" + LTrim(Str(Month(na_dat))))
  dd = IIf(Day(na_dat) < 10, "00" + LTrim(Str(Day(na_dat))), "0" + LTrim(Str(Day(na_dat))))
  ss = LTrim(gg) + LTrim(mm) + LTrim(dd)
  na_ddd = Val(ss) / 1000000

 
  gg = Mid(LTrim(Str(Year(dat))), 3, 2)
  If Year(dat) > 1999 Then
    gg = "1" & gg
  End If
  mm = IIf(Month(dat) < 10, "00" + LTrim(Str(Month(dat))), "0" + LTrim(Str(Month(dat))))
  dd = IIf(Day(dat) < 10, "00" + LTrim(Str(Day(dat))), "0" + LTrim(Str(Day(dat))))
  ss = LTrim(gg) + LTrim(mm) + LTrim(dd)
  ddd = Val(ss) / 1000000
 
  w = na_ddd - ddd
  w1 = w
  w_p = Format(w, "###0.000000")
  t = 0
  For i = 1 To Len(w_p)
    prom = Mid(w_p, i, 1)
    If prom = "." Or prom = "," Then
      Exit For
    End If
  Next i
  t = i
  wg_p = IIf(t = 1, "0", Mid(w_p, 1, t - 1))
  f_m = False
  f_d = False
  If Mid(w_p, t + 1, 1) = 9 Then
    f_m = True
  End If
  If Mid(w_p, t + 1, 2) = 9 Then
    f_m = True
  End If
  If Mid(w_p, t + 1 + 3, 1) = 9 Then
    f_d = True
  End If
  If Mid(w_p, t + 1 + 3, 2) = 9 Then
    f_d = True
  End If
  If f_m And f_d Then
    w = w - 0.98897
  End If
  If f_m And (Not f_d) Then
    w = w - 0.988
  End If
  If (Not f_m) And f_d Then
    w = w - 0.00097
  End If
  w_p = Format(w, "###0.000000")
  wm_p = Mid(w_p, t + 1, 3)
  wd_p = Mid(w_p, t + 1 + 3, 3)
 
  return_m(1) = Val(wg_p)
  return_m(2) = Val(wm_p)
  return_m(3) = Val(wd_p)
  return_m(0) = wg_p + "," + wm_p + "," + wd_p
  MsgBox ("Лет= " & return_m(1) & Chr(10) & "Месяцев= " & return_m(2) & Chr(10) & "Дней= " & return_m(3))
End Function
Private Sub vvv()
    Call Стаж(CDate("12.07.1964"), Date)
End Sub

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.01.2006 (Сб) 6:02

Не нашёл он. Загляни в кирпичи сначала. Специально выложено там.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 21.01.2006 (Сб) 17:28

а так не подходит?
Dim nDay, nMonth, nYear

Private Sub Form_Click()
nDay = DateDiff("d", "01.01.2006", "15.05.2010")
nMonth = DateDiff("m", "01.01.2006", "15.05.2010")
nYear = DateDiff("yyyy", "01.01.2006", "15.05.2010")


Caption = "Day: " & nDay & " Month: " & nMonth & " Year: " & nYear
End Sub

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.01.2006 (Сб) 17:48

Naked
Выполни ? datediff("yyyy","31.12.2005", "01.01.2006")
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 21.01.2006 (Сб) 18:20

нну, год возвратил

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 21.01.2006 (Сб) 18:25

А целых лет прошло 0. Неувязочка.

blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Сообщение blinow » 22.01.2006 (Вс) 4:49

Во первых эту функцию я писал еще студентом на ДВК и там вообще типа Date не существовало, а уж о DateDiff и говорить нечего.
Во вторых Вы что, никогда не сталкивались с таким заданием?
В отделах кадров требуется стаж вычислять именно Лет, Месяцев, Дней или человек считается дитем когда ему 17 лет 11 месяцев и 29 дней, а 17 лет 11 месяцев и 30 дней уже взрослый.
И в третьих ну че эта DateDiff выдает? Разобраться конечно можно, но та формула работает уже лет 50 и выдает что, нужно без проблем.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 22.01.2006 (Вс) 13:07

Код: Выделить всё
Dim d1 As Date, d2 As Date

d1 = DateAdd("yyyy", 17, Now)
d1 = DateAdd("m", 11, d1)
d1 = DateAdd("d", 29, d1)

d2 = DateAdd("yyyy", 17, Now)
d2 = DateAdd("m", 11, d2)
d2 = DateAdd("d", 30, d2)

MsgBox DateDiff("d", d2, d1)


Не проверял, должно работать. Выдает разницу в днях между d1 и d2.

Vladimir!
Обычный пользователь
Обычный пользователь
 
Сообщения: 88
Зарегистрирован: 19.09.2005 (Пн) 21:47
Откуда: Пермь

Сообщение Vladimir! » 22.01.2006 (Вс) 22:42



Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 185

    TopList