Diferencia entre dos fechas

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Diferencia entre dos fechas

Mensaje por Ximorro »

La función _DateDiff devuelve la diferencia entre dos fechas según la magnitud que le pidamos, que puede ser años, meses, días, etc... Por ejemplo si quiero la diferencia entre 1-Ene-2000 y 1-Feb-2001 y lo pido en años me dará 1, si lo pido en meses me dará 13... ¿y si quiero que me diga "1 año y un mes"?.

Pues para eso es este código. Lo acabo de crear y lo pego aquí por si os es útil. Como ejemplo calculo el tiempo que ha pasado desde que nació AutoIt v3 ;-)

Código: Seleccionar todo

#include <Date.au3>
Opt('MustDeclareVars', 1)

Global $fIni, $fFin, $anyos, $meses, $dias
$fIni = "2004/02/29" ;AutoIt v3, día cero
$fFin = _NowCalc()

_DiferenciaFechas($fIni, $fFin, $anyos, $meses, $dias)
MsgBox(0,"",StringFormat("%d años, %d meses, %d días.", $anyos, $meses, $dias))
Exit

Func _DiferenciaFechas($fInicial, $fFinal, ByRef $anyos, ByRef $meses, ByRef $dias)
	Local $ftemp
	$anyos = _DateDiff("y", $fInicial, $fFinal)
	$ftemp = _DateAdd("y", $anyos, $fInicial)
	$meses = _DateDiff("m", $ftemp, $fFinal)
	$ftemp = _DateAdd("m", $meses, $ftemp)
	$dias = _DateDiff("d", $ftemp, $fFinal)
EndFunc
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Diferencia entre dos fechas

Mensaje por Ximorro »

He hecho un pequeño GUI que utiliza la rutina anterior (esta vez convertida en función), así es más "divertido" de manejar.
El original por defecto nada más abrirse me dice la edad exacta que tengo, pero para colgarlo aquí pongo, como arriba, la edad de AutoIt v3, creo que es lo propio ;-)

Código: Seleccionar todo

#include <GUIConstantsEx.au3>
#include <DateTimeConstants.au3>
#include <Date.au3>

Opt('MustDeclareVars', 1)

Global $DTM_SETFORMAT_ = 0x1032, $estilo = "yyyy/MM/dd"
Global $date1, $date2, $fIni, $fFin, $etqTiempo, $etqOrden, $btnCerrar
$fIni = "2004/02/29" ;AutoIt v3, día cero
$fFin = _NowCalc()

GUICreate("Diferencia Fechas", 230, 150)
GUICtrlCreateLabel("Fecha Inicial:", 10, 10, 200)
$date1 = GUICtrlCreateDate($fIni, 10, 25, 100, 20)
GUICtrlSendMsg($date1, $DTM_SETFORMAT_, 0, $estilo)
GUICtrlCreateLabel("Fecha Final:", 120, 10, 200)
$date2 = GUICtrlCreateDate($fFin, 120, 25, 100, 20)
GUICtrlSendMsg($date2, $DTM_SETFORMAT_, 0, $estilo)

_DifFechasStr($fIni, $fFin)
$etqOrden = GUICtrlCreateLabel("Han pasado:", 10, 60, 200)
GUICtrlSetFont(-1, 10, 800)
$etqTiempo = GUICtrlCreateLabel(_DifFechasStr($fIni, $fFin), 10, 80, 200)
GUICtrlSetFont(-1, 10, 800)
$btnCerrar = GUICtrlCreateButton("&Cerrar", 85, 110, 60, 25)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $btnCerrar
			Exit
		Case $date1, $date2
			GuiCtrlSetData($etqTiempo, _DifFechasStr(GuiCtrlRead($date1), GuiCtrlRead($date2)))
	EndSwitch
WEnd

Func _DiferenciaFechas($fIni, $fFin, ByRef $anyos, ByRef $meses, ByRef $dias)
	Local $ftemp
	$anyos = _DateDiff("y", $fIni, $fFin)
	$ftemp = _DateAdd("y", $anyos, $fIni)
	$meses = _DateDiff("m", $ftemp, $fFin)
	$ftemp = _DateAdd("m", $meses, $ftemp)
	$dias = _DateDiff("d", $ftemp, $fFin)
EndFunc

Func _DifFechasStr($fInicial, $fFinal)
	Local $anyos, $meses, $dias, $temp = ""
	If $fInicial > $fFinal Then
		Local $temp = $fInicial
		$fInicial = $fFinal
		$fFinal = $temp
		GuiCtrlSetData($etqOrden, "Faltan:")
	Else
		GuiCtrlSetData($etqOrden, "Han pasado:")
	EndIf
	_DiferenciaFechas($fInicial, $fFinal, $anyos, $meses, $dias)
	Return StringFormat("%d años, %d meses, %d días", $anyos, $meses, $dias)
EndFunc
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Diferencia entre dos fechas

Mensaje por Chefito »

Muy bien. Seguro que alguna vez nos puede hacer falta algo como esto :smt023 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Responder