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


Ir a la página 1, 2  Siguiente

Objetivo: 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

Perfil MP  
Objetivo: 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.

Perfil MP  
Objetivo: 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
Perfil MP  
Objetivo: 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

Objetivo: 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

Perfil MP  
Objetivo: 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
Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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

Perfil MP  
Objetivo: 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

Perfil MP  
Ir a la página 1, 2  Siguiente

Página 1 de 2


  
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

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4793s (PHP: -69% SQL: 169%)
Consultas SQL: 47 - Debug off - GZIP Activado