ze_DateAdd()

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ze_DateAdd()

Mensagem por JoséQuintas »

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: Selecionar todos

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" )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

ze_DateAdd()

Mensagem por JoséQuintas »

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

Código: Selecionar todos

      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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder