Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas
Artículo |
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 [ Viernes, 06 Noviembre 2015, 16:11 ]
|
|
Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas
Comentarios |
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 [ Viernes, 06 Noviembre 2015, 17:53 ]
|
|
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.
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
Cordiales saludos.
última edición por kike1965 el Viernes, 06 Noviembre 2015, 22:56; editado 2 veces
|
kike1965 [ Viernes, 06 Noviembre 2015, 21:50 ]
|
|
Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas
|
|
jsbsan [ Viernes, 06 Noviembre 2015, 23:15 ]
|
|
Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas
|
http://cursogambas.blogspot.com.es/2014/08/calculo-con-fechas-dateadd-y-datediff.html
Bueno, yo propondría:
|
vuott [ Sabado, 07 Noviembre 2015, 01:35 ]
|
|
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 [ Sabado, 07 Noviembre 2015, 07:37 ]
|
|
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
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 [ Sabado, 07 Noviembre 2015, 14:31 ]
|
|
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 [ Sabado, 07 Noviembre 2015, 14:56 ]
|
|
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 [ Sabado, 07 Noviembre 2015, 17:36 ]
|
|
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 [ Domingo, 08 Noviembre 2015, 02:16 ]
|
|
|
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
|
|