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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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