Jump to content
Fivewin Brasil

Função que retorna diferença entre datas em Anos, Meses e Dias


emotta

Recommended Posts

Tentei disponibilizar em dicas mas não consegui. Esta é uma função bem simples que retorna diferença entre datas em Anos, Meses e Dias. Vi algumas que faziam isso mas achei os códigos grandes e complicados... Fiz uma mais limpa...

Exemplo:

Diferença entre as datas 01/01/2012 e 05/08/2014

Retorno: 2 anos 7 meses e 4 dias...

// exemplo de uso

Function u_Teste()
Local dData1
Local dData2
Local aRet

Set Date to Briti

dData1 := CtoD("01/01/2012")   // ano bissexto
dData2 := CtoD("05/08/2014")

MsgStop(StrAnoMesDia(dData1,dData2))
aRet := AnoMesDia(dData1,dData2)
MsgStop(Str(aRet[1],6)+" => anos")
MsgStop(Str(aRet[2],6)+" => meses")
MsgStop(Str(aRet[3],6)+" => dias")

Return


/*
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o    ³ AnoMesDia  ³ Autor | Eduardo Motta         ³ Data ³25/05/2012³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³ Retorna array com 3 posicao referente a diferenca em ano,mes ³±±
±±³          ³ e dias das datas passadas                                    ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Sintaxe   ³ AnoMesDia(dData1,dData2)                                     ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³                                                              ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Uso       ³                                                              ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Function AnoMesDia(dData1,dData2)
Local nDifAno
Local nDifMes
Local nDifDia

//dData2++ // caso queira considerar o dia corrente. Ex: 01/01/2012 - 02/01/2012 => 2 dias. Caso queira desconsiderar comente a linha que o resultado seria 1 dia.

nDifAno := Year(dData2)-Year(dData1)
nDifMes := Month(dData2)-Month(dData1)
nDifDia := Day(dData2)-Day(dData1)

If Month(dData1) > Month(dData2) .or. (Month(dData1) == Month(dData2) .and. Day(dData1) > Day(dData2))
   nDifAno--
   nDifMes+=12
EndIf

If Day(dData1) > Day(dData2)
   nDifMes--
   nDifDia := Day(EoM(AddMonth(dData2,-1))) + nDifDia + 1
EndIf

Return {nDifAno,nDifMes,nDifDia}

/*
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡„o    ³StrAnoMesDia³ Autor | Eduardo Motta         ³ Data ³25/05/2012³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡„o ³ Retorna string contendo descricao da diferenca em ano, mes e ³±±
±±³          ³ e dia das datas passadas                                     ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Sintaxe   ³ AnoMesDia(dData1,dData2)                                     ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³                                                              ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Uso       ³                                                              ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/
Function StrAnoMesDia(dData1,dData2)
Local aRet
Local cStr := ""
Default dData1 := &("M->"+ReadVar())
Default dData2 := Date()

aRet := AnoMesDia(dData1,dData2)

If Empty(dData1) .or. Empty(dData2) .or. (dData1 >= dData2)
   Return cStr
EndIf

If aRet[1] == 1
   cStr+=AllTrim(Str(aRet[1],6))+" ano "
ElseIf aRet[1] > 1
   cStr+=AllTrim(Str(aRet[1],6))+" anos "
EndIf

If aRet[2] == 1
   cStr+=AllTrim(Str(aRet[2],6))+" mês "
ElseIf aRet[2] > 1
   cStr+=AllTrim(Str(aRet[2],6))+" meses "
EndIf

If aRet[3] == 1
   cStr+=AllTrim(Str(aRet[3],6))+" dia "
ElseIf aRet[3] > 1
   cStr+=AllTrim(Str(aRet[3],6))+" dias "
EndIf

Return cStr

Link to comment
Share on other sites

Gilmer farei isso...

Sambo, pra ter o resultado de 366 dias é só vc fazer o tradicional, subtrair uma data da outra.

A minha função é pra retornar a diferença como expliquei, em ano, meses e dias... Exemplo:

Diferença entre as datas 01/01/2012 e 05/08/2014

Retorno: 2 anos 7 meses e 4 dias...

E sim, funciona com ano bissexto

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...