Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Calcular dias, meses y años entre dos fechas

Estas en el tema de Calcular dias, meses y años entre dos fechas en el foro de Visual Basic clásico en Foros del Web. Hola Compañeros de ForosdelWeb Tenía full rato que no pasaba por aca... La razón de mi visita se debe a una inquietud que tengo... y ...
  #1 (permalink)  
Antiguo 07/06/2010, 07:35
 
Fecha de Ingreso: febrero-2009
Mensajes: 101
Antigüedad: 15 años, 1 mes
Puntos: 0
Calcular dias, meses y años entre dos fechas

Hola Compañeros de ForosdelWeb

Tenía full rato que no pasaba por aca... La razón de mi visita se debe a una inquietud que tengo... y no logro resolver...

Necesito determinar los días, meses y años entre dos fecha (si aplica) por ejemplo:

FechaInicial = 24/04/2010
FechaActual=07/06/2010

Y que la funcion me devuelva: en variables

Años= 0
Meses= 1
Dias= 12

'************************************************* **************'
He encontrado este codigo y trate de adaptar... Es una funcion que me devuelve una cadena en un formato algo asi: YYYY/MM/DD ... Luego fuera de la funcion trato el resultado por una cadena... ok

Pero la funcion no esta funcionando del todo bien... Porque al pasar la FechaInicial y la FechaActual ... me devuelve 0 años... 2 meses ... y -20 dias ...

Código:
Public Function Calcular_Ultima_Visita(FechaInicial As Date, FechaActual As Date) As String
    Dim Anios, Meses, Dias As Variant    
    '**************************************************'
    Anios = DateDiff("yyyy", FechaInicial, FechaActual)
    If Format(FechaActual, "yyyy-mm-dd") < DateSerial(Year(FechaActual), Month(FechaInicial), Day(FechaInicial)) Then
        Anios = Anios - 1
    End If
    FechaInicial = DateAdd("YYYY", Años, FechaInicial)

    Meses = DateDiff("m", FechaInicial, FechaActual)
    If Format(FechaActual, "yyyy-mm-dd") < DateSerial(Year(FechaActual), Month(FechaInicial), Day(FechaInicial)) Then
        Meses = Meses - 1
    End If
    FechaInicial = DateAdd("m", Meses, FechaInicial)

    Dias = DateDiff("d", FechaInicial, FechaActual)
    If Format(FechaActual, "yyyy-mm-dd") < DateSerial(Year(FechaActual), Month(FechaInicial), Day(FechaInicial)) Then
        Dias = Dias - 1
    End If
    FechaInicial = DateAdd("d", Dias, FechaInicial)

    Calcular_Ultima_Visita = Anios & "/" & Meses & "/" & Dias
    
End Function
Aca usan la funcion DateSerial que de verdad lo termino de entender... Y cuando a la variable FechaInicial le agregan los dias de la misma FechaInicial tampoco lo comprendo...

Por favor me dan una asesoria... Gracias

Saludos y Éxitos
__________________
Fiorellita
  #2 (permalink)  
Antiguo 07/06/2010, 08:38
Avatar de lokoman  
Fecha de Ingreso: septiembre-2009
Mensajes: 502
Antigüedad: 14 años, 6 meses
Puntos: 47
Respuesta: Calcular dias, meses y años entre dos fechas

Hola!!
Creo que esto te puede ayudar:

Código vb:
Ver original
  1. Private Sub Command1_Click()
  2.     Dim Fecha1 As Date, Fecha2 As Date
  3.     Fecha1 = "24/04/2010"
  4.     Fecha2 = "07/06/2010"
  5.    
  6.  
  7.     MsgBox DateDiff("d", Fecha1, Fecha2) & " Dias " & _
  8.            DateDiff("m", Fecha1, Fecha2) & " Mes " & _
  9.            DateDiff("yyyy", Fecha1, Fecha2) & " Años "
  10. End Sub
Pero desde el 24 de abril hasta el 7 de junio no hay 12 dias...

Última edición por lokoman; 07/06/2010 a las 08:50
  #3 (permalink)  
Antiguo 07/06/2010, 09:00
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 4 meses
Puntos: 53
Respuesta: Calcular dias, meses y años entre dos fechas

Hola lokoman, creo que la vas a liar aun un poco mas, ya que por lo menos a mi tu funcion me dice que entre estas fechas hay 44 dias y 2 meses por lo que me da la extraña sensación de que no es esa la intención.

Es mas, acabo de hacer una prueba que nunca se me hubiera ocurrido y o bien lo utilizamos mal o el DateDiff devuelve verdaderas barbaridades.

Ya que por ejemplo

datediff("m", cdate("31/01/2010"), cdate("01/02/2010"))

Devuelve 1 mes, o sea una canallada ya que por lo menos en mi pueblo hay 1 día. Intentaré indagar por donde nos equivocamos o me equivoco.

Saludos ¿ a ver quien lo encuentra antes ?
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #4 (permalink)  
Antiguo 07/06/2010, 09:04
 
Fecha de Ingreso: febrero-2009
Mensajes: 101
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular dias, meses y años entre dos fechas

Hola lokoman !!!!

Gracias por tu respuesta...

Fijate que tú te enfocas en las horas, los segundos y los minutos...

Porque parte de dia... en el caso del DateDiff... yo no quiero las horas... solo los años, los meses y los dias... y de hecho probe la función que me enviastes... aun sin embargo sigue enviando la cantidad de dias errados... me dice que entre 26/04/2010 y el 07/06/2010 hay 0 años, 2 meses y 42 dias ...

Muchas gracias ... pero no me sirve para lo que requiero...
__________________
Fiorellita
  #5 (permalink)  
Antiguo 07/06/2010, 09:07
 
Fecha de Ingreso: febrero-2009
Mensajes: 101
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular dias, meses y años entre dos fechas

Hola Erbuson

Si... la función que nos envio locoman no satiface mis necesidades... de hecho la funcion que yo utilizo hasta cierto punto funciona bien... pero hay otras veces que no funciona... No se si te haras fijado en la funcion... Pero porfa pruebala si ¿?

Muchas gracias chicos lindos...

Saludos y Éxitos
__________________
Fiorellita
  #6 (permalink)  
Antiguo 07/06/2010, 11:14
Avatar de lokoman  
Fecha de Ingreso: septiembre-2009
Mensajes: 502
Antigüedad: 14 años, 6 meses
Puntos: 47
Respuesta: Calcular dias, meses y años entre dos fechas

Cita:
Iniciado por erbuson Ver Mensaje
Hola lokoman, creo que la vas a liar aun un poco mas, ya que por lo menos a mi tu funcion me dice que entre estas fechas hay 44 dias y 2 meses por lo que me da la extraña sensación de que no es esa la intención.

Es mas, acabo de hacer una prueba que nunca se me hubiera ocurrido y o bien lo utilizamos mal o el DateDiff devuelve verdaderas barbaridades.

Ya que por ejemplo

datediff("m", cdate("31/01/2010"), cdate("01/02/2010"))

Devuelve 1 mes, o sea una canallada ya que por lo menos en mi pueblo hay 1 día. Intentaré indagar por donde nos equivocamos o me equivoco.

Saludos ¿ a ver quien lo encuentra antes ?
Contando los dias desde el 24 de abril hasta el 07 de junio, hay 44 dias (aqui todo bien)

La diferencia de los meses (6-4=2) por eso sale dos...

Y eso lo encontré en la ayuda....
"When comparing December 31 to January 1 of the immediately succeeding year, DateDiff for Year ("yyyy") returns 1 even though only a day has elapsed."
(Al comparar diciembre 31 a enero 1 del año inmediatamente siguiente, DateDiff para Año ("yyyy") devuelve 1, incluso si sólo un día ha transcurrido.)

... , pero sigo en eso!!
  #7 (permalink)  
Antiguo 07/06/2010, 11:39
 
Fecha de Ingreso: febrero-2009
Mensajes: 101
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular dias, meses y años entre dos fechas

Hola Lokoman...
Al fin resolvi... Buscando en la web encontre este ejercicio... No usa mucho las funciones de vb 6.0 ... mas que todo es logica... Estaba hecho en php ... pero lo adapte a vb !!! Y lo mejor de todo es que funciona a la perfección...

Te lo dejo para que lo pruebes!!! Muchas gracias

Código vb:
Ver original
  1. Public Function Calcular(FechaInicio As Date, FechaActual As Date) As String
  2.  
  3. diaActual = DatePart("d", FechaActual)      
  4. mesActual = DatePart("m", FechaActual)      
  5. anioActual = DatePart("yyyy", FechaActual)  
  6. '**************************************'
  7. diaInicio = DatePart("d", FechaInicio)      
  8. mesInicio = DatePart("m", FechaInicio)      
  9. anioInicio = DatePart("yyyy", FechaInicio)      
  10.  
  11. B = 0
  12. Mes = mesInicio - 1
  13.  
  14. ' si el mes es febrero
  15. If (Mes = 2) Then   ' *
  16.    If ((anioActual / 4 = 0 And anioActual / 100! = 0) Or anioActual / 400 = 0) Then
  17.         B = 29
  18.     Else
  19.         B = 28
  20.     End If
  21. ElseIf (Mes <= 7) Then  '*
  22.    If (Mes = 0) Then
  23.         B = 31
  24.     ElseIf (Mes / 2 = 0) Then
  25.         B = 30
  26.     Else
  27.         B = 31
  28.     End If
  29.    
  30. ElseIf (Mes > 7) Then
  31.     If (Mes / 2 = 0) Then
  32.         B = 31
  33.     Else
  34.         B = 30
  35.     End If
  36. End If
  37.    
  38.    If ((anioInicio > anioActual) Or (anioInicio = anioActual And mesInicio > mesActual) Or (anioInicio = anioActual And mesInicio = mesActual And diaInicio > diaActual)) Then
  39.         MsgBox "La fecha de inicio ha de ser anterior a la fecha Actual"
  40.    Else
  41.         If (mesInicio <= mesActual) Then
  42.             Anios = anioActual - anioInicio
  43.             If (diaInicio <= diaActual) Then
  44.                 Meses = mesActual - mesInicio
  45.                 Dias = diaActual - diaInicio
  46.             Else
  47.                 If (mesActual = mesInicio) Then
  48.                     Anios = Anios - 1
  49.                 End If
  50.                 Meses = (mesActual - mesInicio - 1 + 12) / 12
  51.                 Dias = B - (diaInicio - diaActual)
  52.             End If
  53.         Else
  54.             Anios = anioActual - anioInicio - 1
  55.  
  56.         If (diaInicio > diaActual) Then
  57.             Meses = mesActual - mesInicio - 1 + 12
  58.             Dias = B - (diaInicio - diaActual)
  59.         Else
  60.             Meses = mesActual - mesInicio + 12
  61.             Dias = diaActual - diaInicio
  62.         End If
  63.   End If
  64.  
  65. End If '*
  66.  
  67. Calcular = Anios & "/" & Meses & "/" & Dias
  68.  
  69. End Function

La funcion DatePart ... toma la parte de la fecha dependiendo del parametro ...

Saludos y Éxitos
__________________
Fiorellita
  #8 (permalink)  
Antiguo 08/06/2010, 07:31
Avatar de lokoman  
Fecha de Ingreso: septiembre-2009
Mensajes: 502
Antigüedad: 14 años, 6 meses
Puntos: 47
Respuesta: Calcular dias, meses y años entre dos fechas

Muy bueno el ejercicio!!
Aqui dejo el mini proyecto que hice:
http://myfreefilehosting.com/f/189ac8d9a1_0.03MB

Y el codigo que usé:
Código vb:
Ver original
  1. Private Sub Command1_Click()
  2.     Dim Mes(12) As Integer, Fecha1 As Date, Fecha2 As Date
  3.     Dim TotalMes As Long, TotalAno As Long
  4.     Dim Aux As Long, Aux2 As Long, DiferenciaDias As Long
  5.    
  6.     Fecha1 = DTPicker1.Value
  7.     Fecha2 = DTPicker2.Value
  8.    
  9.     Mes(1) = 31
  10.     Aux = DatePart("yyyy", Fecha1)
  11.    
  12.     If ((Aux / 4 = 0 And Aux / 100! = 0) Or Aux / 400 = 0) Then
  13.         Mes(2) = 29
  14.     Else
  15.         Mes(2) = 28
  16.     End If
  17.    
  18.     Mes(3) = 31
  19.     Mes(4) = 30
  20.     Mes(5) = 31
  21.     Mes(6) = 30
  22.     Mes(7) = 31
  23.     Mes(8) = 31
  24.     Mes(9) = 30
  25.     Mes(10) = 31
  26.     Mes(11) = 30
  27.     Mes(12) = 31
  28.    
  29.     TotalAno = 0
  30.     TotalMes = 0
  31.     DiferenciaDias = 0
  32.     Aux2 = 0
  33.    
  34.     Aux = DatePart("m", Fecha1)
  35.     DiferenciaDias = DateValue(Fecha2) - DateValue(Fecha1)
  36.     Aux2 = DiferenciaDias
  37.    
  38.     Do While Aux2 > 0
  39.         If Aux = 12 Then
  40.             Aux = 1
  41.         Else
  42.             Aux = Aux + 1
  43.         End If
  44.         Aux2 = (Aux2 - Mes(Aux))
  45.         TotalMes = TotalMes + 1
  46.     Loop
  47.    
  48.     If Aux2 < 0 Then TotalMes = TotalMes - 1
  49.     TotalAno = TotalMes / 12
  50.    
  51.     MsgBox "Total de dias...: " & FormatNumber(DiferenciaDias, 0) & vbNewLine & _
  52.            "Total de mes...: " & FormatNumber(TotalMes, 0) & vbNewLine & _
  53.            "Total años......: " & FormatNumber(TotalAno, 0)
  54. End Sub
  55.  
  56. Private Sub Form_Load()
  57.     DTPicker1.Value = Date
  58.     DTPicker2.Value = Date
  59. End Sub

Usé una referencia a Microsoft Windows Common Controls 2.6 para usar un DTPicker para la seleccion de las fechas, el resto en un Command Button.

!!
  #9 (permalink)  
Antiguo 08/06/2010, 08:09
 
Fecha de Ingreso: febrero-2009
Mensajes: 101
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Calcular dias, meses y años entre dos fechas

Hola Lokoman

Probe tu proyecto... y pues el problema del que te hablo sigue persitiendo... Se que evidentemente entre (por ejemplo) 28/04/2010 al 08/07/2010 hay 41 días... Y si muestras por pantalla 1 mes con 41 dias... Los usuarios (te lo digo porque me paso) diran que eso esta malo... que decir 41 dias ya equivale a otro mes...

Y una sugerencia... hay un control llamado aBox ... Es super fino... yo lo utilizo... Es un control para fechas... pero tiene mas funciones... Si te interesa me avisas!!!

Saludos y Éxitos
__________________
Fiorellita
  #10 (permalink)  
Antiguo 02/01/2013, 16:56
IOT
 
Fecha de Ingreso: enero-2013
Mensajes: 1
Antigüedad: 11 años, 3 meses
Puntos: 0
Exclamación Respuesta: Calcular dias, meses y años entre dos fechas


Entre esas fechas NO HAY 41 dias SINO 70 dias.
* 71 si se incluye la ultima fecha. (resultado deseado)
* 72 si se incluyen ambas fechas.

Por lo que 1 mes 41 dias es buena respuesta para esas fechas.

el codigo mas arriba esta mal en:
Código:
DiferenciaDias = DateValue(Fecha2) - DateValue(Fecha1)
* Un timestamp no se puede convertir a long

El problema reside en calcular fechas como: 31-12-2000 y 01-01-2001, aun que con un datediff podriamos obtener ese resultado
  #11 (permalink)  
Antiguo 27/04/2016, 14:08
 
Fecha de Ingreso: abril-2016
Mensajes: 1
Antigüedad: 8 años
Puntos: 0
Respuesta: Calcular dias, meses y años entre dos fechas

Buenas tardes...disculpen tengo un duda acerca del tema sobre las fechas...me presenta el siguiente error DiferenciaDias = DateValue(Fecha2) - DateValue(Fecha1)...trato de identificar a q se debe .....pero antes de la ejecucion se muestra q necesito un TimeSpan..trato de incorporarlo pero no me la acepta ...agradecería mucho su aportacion..

Etiquetas: dias, dos, fechas, meses, calculadora
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:31.