|
Página 1 de 2
|
Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas
Autor |
Mensaje |
kike1965
Usuario
Registrado: Noviembre 2015
Mensajes: 12
Edad: 58 Ubicación: Región de Atacama
|
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
|
#1 Viernes, 06 Noviembre 2015, 16:11 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
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.
=================== No podemos regresar
|
#2 Viernes, 06 Noviembre 2015, 17:53 |
|
|
kike1965
Usuario
Registrado: Noviembre 2015
Mensajes: 12
Edad: 58 Ubicación: Región de Atacama
|
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
|
#3 Viernes, 06 Noviembre 2015, 21:50 |
|
|
jsbsan
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
|
Re: Cómo Poder Hacer Cálculo Que Indique Años, Meses Y Días Entre Dos Fechas
|
#4 Viernes, 06 Noviembre 2015, 23:15 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
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:
|
#5 Sabado, 07 Noviembre 2015, 01:35 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
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
=================== No podemos regresar
última edición por shordi el Sabado, 07 Noviembre 2015, 07:40; editado 1 vez
|
#6 Sabado, 07 Noviembre 2015, 07:37 |
|
|
kike1965
Usuario
Registrado: Noviembre 2015
Mensajes: 12
Edad: 58 Ubicación: Región de Atacama
|
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
|
#7 Sabado, 07 Noviembre 2015, 14:31 |
|
|
vuott
Analista Programador
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
|
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
|
#8 Sabado, 07 Noviembre 2015, 14:56 |
|
|
shordi
Analista Programador
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
|
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
=================== No podemos regresar
|
#9 Sabado, 07 Noviembre 2015, 17:36 |
|
|
wikiuy
Usuario
Registrado: Noviembre 2015
Mensajes: 1
Edad: 47
|
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
|
#10 Domingo, 08 Noviembre 2015, 02:16 |
|
|
|
Temas parecidos
Temas parecidos
|
Página 1 de 2
|
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
|
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario
|
|
|
|
|