Clipper On Line • Ver Tópico - ze_DateAdd()
Mudar para estilo Clássico
Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.
Postar uma resposta

ze_DateAdd()

08 Jul 2020 13:21

Acrescentei na sefazclass.
Pra evitar conflito, tem o prefixo ze_, porque o nome é muito comum.
Pra somar/tirar dias/meses/anos de uma data

Código:
FUNCTION ze_DateAdd( dDate, nValue, cType )

   LOCAL nDay, nMonth, nYear

   hb_Default( @cType, "D" )
   cType := iif( cType $ "DMY", cType, "D" )

   DO CASE
   CASE cType == "D"
      dDate += nValue
   CASE cType == "Y"
      dDate := Stod( StrZero( Year( dDate ) + nValue, 4 ) + Substr( Dtos( dDate ), 5 ) )
   CASE cType == "M"
      nDay   := Day( dDate )
      nMonth := Month( dDate ) + nValue
      nYear  := Year( dDate )
      IF nMonth < 1
         nYear -= Int( Abs( nMonth ) / 12 ) + 1
         nMonth += ( Int( Abs( nMonth ) / 12 ) + 1 ) * 12
      ENDIF
      IF nMonth > 12
         nYear  += Int( ( nMonth - 1 ) / 12 )
         nMonth := Mod( ( nMonth - 1 ), 12 )
      ENDIF
      DO WHILE Empty( dDate := Stod( StrZero( nYear, 4 ) + StrZero( nMonth, 2 ) + StrZero( nDay, 2 ) ) )
         nDay -= 1
      ENDDO
   ENDCASE

   RETURN dDate


ze_DateAdd( Date(), 10, "D" )
ze_DateAdd( Date(), 10, "M" )
ze_DateAdd( Date(), 10, "Y" )
ze_DateAdd( Date(), -10, "D" )
ze_DateAdd( Date(), -10, "M" )
ze_DateAdd( Date(), -10, "Y" )

ze_DateAdd()

08 Jul 2020 14:59

Não tava gostando do DO WHILE, mas hoje achei solução.

Código:
      dDate := Stod( StrZero( nYear, 4 ) + StrZero( nMonth, 2 ) + "01" ) + nDay - 1
      IF Month( dDate ) != nMonth
         dDate := dDate - Day( dDate )
      ENDIF


Porque complicar?
Porque não existe 29/02, 30/02, 31/02, ou 31/06, etc.

A solução acima foi mais simples: somo o dia calculado ao dia 1 (não pode ser zero) e tiro 1.
Se passou do mes que deveria ser, tiro a quantidade de dias e pronto, fica no último dia do mes.

Exemplo: 31 de fevereiro, no primeiro cálculo daria 02 ou 03 de março. Ao subtrair o 2 ou 3, fica dia 28 ou 29 de fevereiro, o que for válido.
Stod() retorna vazio se data for inválida, e usar DO WHILE pode estar sujeito a travamento.
Postar uma resposta