Clipper On Line • Ver Tópico - ze_DateAdd()

ze_DateAdd()

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

Moderador: Moderadores

 

ze_DateAdd()

Mensagempor JoséQuintas » 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

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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14660
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

ze_DateAdd()

Mensagempor JoséQuintas » 08 Jul 2020 14:59

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

      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.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 14660
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes




Retornar para Contribuições, Dicas e Tutoriais

Quem está online

Usuários vendo este fórum: Ahrefs [Bot] e 5 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro