Introdução
Neste final de semana um amigo me perguntou se tinha alguma função AdvPL que fosse capaz de converter uma data do nosso calendário (gregoriano) representada por dia, mês e ano, em uma data Juliana.
Problemática e Pesquisa
Na verdade nem eu sabia o que era uma “data Juliana”, até realizar uma pesquisa. Trocando em miúdos, uma data Juliana é representada em um número de dias decorridos a partir do “dia zero”, ou data de início do calendário. No caso, a “data zero” do calendário Juliano no calendário Gregoriano é 24/11/4714 ac. Logo, a data Juliana 2458588 no nosso calendário refere-se ao dia 14 de Abril de 2019, pois este foi o número de dias decorridos desde 24/11/4714 ac até 14/04/2019 (dc).
Nas pesquisas, encontrei e cheguei até a implementar uma função matemática que realizaria este cálculo, a partir de uma data qualquer, encontrar a data Juliana correspondente. Porém, estava um pouco difícil fazer o contrário — a partir de uma data Juliana, determinar sua representação no calendário gregoriano.
Solução
Por incrível que pareça, a solução para isso em AdvPL, ou qualquer outra linguagem que seja capaz de calcular um intervalo em dias a partir de uma data qualquer é muito simples. Se a linguagem permite calcular uma diferença entre datas, e permite somar ou subtrair um número de dias a partir de uma data qualquer, basta fazer o seguinte:
- Estipular uma “data zero” como base de cálculo. Por exemplo , 01/01/1980.
- Encontrar a data Juliana correspondente — no caso, 2444240.
- Para encontrar a data Juliana a partir de uma data qualquer, basta usar as funções de data disponíveis na sua linguagem, para determinar o número de dias decorridos desde 01/01/1980 até a data em questão, e somar 2444240.
- Para encontrar a data Gregoriana correspondente a uma data Juliana, basta subtrair 2444240 unidades da data Juliana para obter o número de dias decorridos desde 01/01/1980 — que pode ser um valor positivo, negativo ou mesmo zero — e depois partir da data 01/01/1980 e adicionar esta diferença, obtendo a data.
Em AdvPL
// ---------------------------------------- // Converte Data Juliana em Data AdvPL STATIC Function Date2DJ(dDate) Return (dDate - ctod("01/01/1980")) + 2444240 // ---------------------------------------- // Converte Data Juliana em Data AdvPL STATIC Function DJ2Date(nDJ) Return ctod("01/01/1980") + ( nDJ - 2444240 )
Conclusão
Sim, pode ser feito, e de forma simples. Agradecimentos ao meu amigo Marcos Gomes, cuja dúvida me ajudou a conhecer mais um pouco sobre Calendários 😉
Referências
- CALENDÁRIO GREGORIANO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2019. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Calend%C3%A1rio_gregoriano&oldid=54601235>. Acesso em: 26 mar. 2019.
- DATA JULIANA. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2019. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Data_juliana&oldid=54762458>. Acesso em: 9 abr. 2019.
- Dias Julianos – TELMO GHIORZI – Disponível em: <http://ghiorzi.org/diasjuli.htm>. Acesso em: 9 abr. 2019.
Boa noite Julião,
Isso é muito usado em boletos bancários. O último bloco da linha digitavel refere-se ao vencimento em formato Juliano e ao Valor, onde a data de partida é 07/10/1997 instituída pelo BACEN.
Fonte: http://pensanaweb.com.br/validadores/calculo-do-codigo-de-barras-do-boleto-bancario-padrao-febraban/
CurtirCurtido por 1 pessoa
Que legal !!! Não sabia dessa …rs… mais uma informação para a Base de Conhecimento.
Obigado 😉
CurtirCurtir
Olá!
Estou fazendo um programa para fazer esse cálculo da data juliana para o CNAB do Bradesco no Protheus, muito bom seu post!
Só não entendi como chegou no valor 2444240.
Consegue me explicar, por favor?
CurtirCurtido por 1 pessoa
Opa, sim … Com o AdvPl consegue fazer calculo com diferenças de datas, e uma data juliana é a diferenca de dias para uma data “zero” do calendario, eu escolhi um dia fixo no calendario gregoriano ( 01/01/1980 ) , e a data juliana correspondente é 2444240. 😀
CurtirCurtir