Portal    Foro    Buscar    FAQ    Registrarse    Conectarse

Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas

Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas
Artículo
Responder citando    Descargar mensaje  
Mensaje Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
Hola amigos, he estado viendo cómo poder calcular el tiempo entre dos fechas, pero que me indique años, meses y días. Con DateDiff no se puede porque entiendo que solo puede resolver años o meses o días, pero no me sirve de ese modo.  Si alguien me puede orientar.  Se los agradezco.

Mis cordiales saludos.

Ubuntu 15.10
gambas 3.8.2
Unity



 
kike1965 - Ver perfil del usuario Enviar mensaje privado  
kike1965 [ Viernes, 06 Noviembre 2015, 16:11 ]
 


Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas
Comentarios
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
Saca la diferencia entre las dos fechas en días y haz el cálculo tú mismo. Es simple: divide entre 365 el resto entre 30 y el resto son los días... más o menos.



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Viernes, 06 Noviembre 2015, 17:53 ]
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
shordi escribió: [Ver mensaje]
Saca la diferencia entre las dos fechas en días y haz el cálculo tú mismo. Es simple: divide entre 365 el resto entre 30 y el resto son los días... más o menos.


Gracias por responder Shordi, pero el problema es que no puedo aplicar matemática ya que en factor años, meses y días me encuentro con la dificultad de años bisiestos, meses con 28, 29, 30 ó 31 días.

Estoy tratando con esto, pero no me va

Public Sub Button1_Click()
  
  Dim A As Date
  Dim B As Date
  
  A = DateBox1.Value
  B = DateBox2.Value
  
  TextBox1.Text = Year(B) - Year(A)
    If Month(A) > Month(B) Then
    TextBox3.Text = TextBox3.Text - 1
  End If
  
  TextBox2.Text = Month(B) - Month(A)
    If Month(A) > Month(B) Then
      TextBox2.text = 12 - (TextBox2.Text * -1)
    Endif
    
  'TextBox3.Text =
  
End
 


Cordiales saludos.



 
última edición por kike1965 el Viernes, 06 Noviembre 2015, 22:56; editado 2 veces 
kike1965 - Ver perfil del usuario Enviar mensaje privado  
kike1965 [ Viernes, 06 Noviembre 2015, 21:50 ]
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
Mirate este enlace:

http://cursogambas.blogspot.com.es/...y-datediff.html

Saludos



 
jsbsan - Ver perfil del usuario Enviar mensaje privado  
jsbsan [ Viernes, 06 Noviembre 2015, 23:15 ]
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
jsbsan escribió: [Ver mensaje]
http://cursogambas.blogspot.com.es/2014/08/calculo-con-fechas-dateadd-y-datediff.html


Bueno, yo propondría:

Public Sub Main()

  Dim d1, d2 As Date
  Dim i As Integer
  
    d1 = Date(2010, 01, 01)
    d2 = Now
    
    i = DateDiff(d1, d2, gb.day)
    Print "Dias:", i
    
    Print i \ 365; ":"; (i Mod 365) \ 30; ":"; (i Mod 365) Mod 30

End




 
vuott - Ver perfil del usuario Enviar mensaje privado  
vuott [ Sabado, 07 Noviembre 2015, 01:35 ]
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
Prueba ésto:
Public Sub diferencia(dateDesde As Date, dateHasta As Date)
    Dim a, m, d As Integer
    Dim td As Date

    a = DateDiff(dateDesde, dateHasta, gb.Year)  
    a = IIf(DateAdd(dateDesde, gb.year, a) > dateHasta, a - 1, a)
    m = DateDiff(dateDesde, datehasta, gb.month) Mod 12
    td = DateAdd(datedesde, gb.year, a)
    m = IIf(DateAdd(td, gb.month, m) > datehasta, m - 1, m)
    td = DateAdd(td, gb.month, m)
    d = DateDiff(td, datehasta, gb.day)
    
    Print "Entre ";; dateDesde;; " a ";; dateHasta;; " hay ";; a;; " años,";; m;; " meses, ";; d;; " días"
    
End




 
última edición por shordi el Sabado, 07 Noviembre 2015, 07:40; editado 1 vez 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Sabado, 07 Noviembre 2015, 07:37 ]
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
shordi escribió: [Ver mensaje]
Prueba ésto:
Public Sub diferencia(dateDesde As Date, dateHasta As Date)
    Dim a, m, d As Integer
    Dim td As Date

    a = DateDiff(dateDesde, dateHasta, gb.Year)  
    a = IIf(DateAdd(dateDesde, gb.year, a) > dateHasta, a - 1, a)
    m = DateDiff(dateDesde, datehasta, gb.month) Mod 12
    td = DateAdd(datedesde, gb.year, a)
    m = IIf(DateAdd(td, gb.month, m) > datehasta, m - 1, m)
    td = DateAdd(td, gb.month, m)
    d = DateDiff(td, datehasta, gb.day)
    
    Print "Entre ";; dateDesde;; " a ";; dateHasta;; " hay ";; a;; " años,";; m;; " meses, ";; d;; " días"
    
End


Excelente Shordi, tenías toda la razón con DateDiff y DateAdd sí era posible.  Hay un detalle en el cálculo cuando involucra el mismo mes ya que suma los días pero no los transforma a meses, por ejemplo:

Citar:
Entre  14/11/1979 00:00:00  a  07/11/2015 00:00:00  hay  35  años, 0  meses,  358  días


Voy a revisarlo bien, muchas gracias Shordi



 
kike1965 - Ver perfil del usuario Enviar mensaje privado  
kike1965 [ Sabado, 07 Noviembre 2015, 14:31 ]
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
...si te gusta complicarte la vida, puedes utilizar las funciones externas de la libreria de Libglib-2.0:  

Public Struct GTimeVal
  tv_sec As Long
  tv_usec As Long
End Struct


Library "libglib-2.0"

' GDateTime * g_date_time_new_local(gint year, gint month, gint day, gint hour, gint minute, gdouble seconds)
' Creates a new GDateTime corresponding to the given date and time in the local time zone.
Private Extern g_date_time_new_local(Gyear As Integer, Gmonth As Integer, Gday As Integer, Ghour As Integer, Gminute As Integer, Gseconds As Float) As Pointer

' GTimeSpan g_date_time_difference (GDateTime *end, GDateTime *begin)
' Calculates the difference in time between end and begin.
Private Extern g_date_time_difference(Gend As Pointer, Gbegin As Pointer) As Long

' GDateTime * g_date_time_new_from_timeval_local (const GTimeVal *tv)
' Creates a GDateTime corresponding to the given GTimeVal tv in the local time zone.
Private Extern g_date_time_new_from_timeval_local(tv As GTimeVal) As Pointer

' void g_date_time_get_ymd (GDateTime *datetime, gint *year, gint month, gint day)
' Retrieves the Gregorian day, month, and year of a given GDateTime.
Private Extern g_date_time_get_ymd(datetime As Pointer, Gyear As Pointer, Gmonth As Pointer, Gday As Pointer)


Public Sub Main()

  Dim t1, t2, dt As Pointer
  Dim a, m, d As Integer
  Dim dif As Long
  Dim tiva As New GTimeVal
  
    t1 = g_date_time_new_local(1979, 11, 14, 0, 0, 0)
    t2 = g_date_time_new_local(2015, 11, 7, 0, 0, 0)
    
    dif = g_date_time_difference(t2, t1)

    tiva.tv_usec = dif
    
    dt = g_date_time_new_from_timeval_local(tiva)
    
    g_date_time_get_ymd(dt, VarPtr(a), VarPtr(m), VarPtr(d))
    
    Print a - 1970; ":"; m - 1; ":"; d - 1

End




 
vuott - Ver perfil del usuario Enviar mensaje privado  
vuott [ Sabado, 07 Noviembre 2015, 14:56 ]
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
Citar:

Excelente Shordi, tenías toda la razón con DateDiff y DateAdd sí era posible.  Hay un detalle en el cálculo cuando involucra el mismo mes ya que suma los días pero no los transforma a meses, por ejemplo:

    Citar:
    Entre  14/11/1979 00:00:00  a  07/11/2015 00:00:00  hay  35  años, 0  meses,  358  días



Voy a revisarlo bien, muchas gracias Shordi

Perfecto, lo hice un tanto de correprisas anoche. Cuando lo tengas depurado súbelo para beneficio de todos... y mío, claro    



 
shordi - Ver perfil del usuario Enviar mensaje privado  
shordi [ Sabado, 07 Noviembre 2015, 17:36 ]
Responder citando    Descargar mensaje  
Mensaje Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas 
 
Buenas a todos.
Pues vi el tema buscando aprender a usar este lenguaje y manipular fechas suele ser muy útil como pesado en ciertas ocasiones.
Hace menos de 24 horas que instale gambas y me puse a experimentar, vale, que sin experimentar nada se aprende.
Vi varios comentarios donde usáis varias funciones de manejo de datos fecha, pero yo como cabeza dura y anticuado probé algo mas rudimentario pero que según mis pruebas da buen resultado y aquí os dejo lo que logre.


Public Sub diferencia(f1 As Date, f2 As Date)
'f1 y f2 las fechas que pasamos a trabajar
    
   Dim  d As Integer
'variable d donde guardamos la cantidad de dias

d = DateDiff(f1, f2, gb.day) - Int(DateDiff(f1,f2,gb.year) / 4)

'a la cantidad de dias obtenida con DateDiff le resto el resultado entero de la cantidad de años dividido 4, Int(DateDiff(f1,f2,gb.year) / 4)
'con esto ajustamos el dia extra en los años bisiestos

anios.text = Int(d / 365)
'Anios es años(no me deja nombrar con ñ jaja), calculado a partir del entero de dividir los días entre 365

meses.text = Int(Int(((d / 365) - Int(d / 365)) * 365) / 30)

'Los meses los calculo restando el entero de años de dividir los días entre 365.
'Al decimal (menor que 1) restante lo multiplico por 30 y de ese resultado filtro la parte decimal para obtener meses enteros.

dias.text = Int((((((d / 365) - Int(d / 365)) * 365) / 30) - Int((((d / 365) - Int(d / 365)) * 365) / 30)) * 30)

'Del mismo modo que para calcular los meses pero esta vez restando los meses enteros y nuevamente al resto menor que 1 lo multiplico por 30 para obtener dias y de ese resultado uso el entero tbn.
End
 


Espero se entienda saludos



 
wikiuy - Ver perfil del usuario Enviar mensaje privado  
wikiuy [ Domingo, 08 Noviembre 2015, 02:16 ]
Mostrar mensajes anteriores:    
 
Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 



 

cron