Página 1 de 1

Diferencia entre dos fechas

Publicado: 31 May 2010, 12:47
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

Re: Diferencia entre dos fechas

Publicado: 01 Jun 2010, 12:53
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

Re: Diferencia entre dos fechas

Publicado: 01 Jun 2010, 15:29
por Chefito
Muy bien. Seguro que alguna vez nos puede hacer falta algo como esto :smt023 .

Saludos.