{"id":655,"date":"2016-03-02T18:57:59","date_gmt":"2016-03-02T18:57:59","guid":{"rendered":"https:\/\/possibleapp.com\/blog\/?p=655"},"modified":"2016-03-02T18:57:59","modified_gmt":"2016-03-02T18:57:59","slug":"determinar-si-un-ano-es-bisiesto","status":"publish","type":"post","link":"https:\/\/possibleapp.com\/blog\/2016\/03\/determinar-si-un-ano-es-bisiesto\/","title":{"rendered":"Determinar si un a\u00f1o es bisiesto"},"content":{"rendered":"<p>El d\u00eda de hoy tenemos un d\u00eda extra en el calendario debido a que el a\u00f1o 2016 es bisiesto, el algoritmo para determinar si un a\u00f1o es bisiesto lo podemos necesitar desde en un ejercicio de programaci\u00f3n hasta en una entrevista de trabajo. Aqu\u00ed discutiremos algunos de los m\u00e9todos m\u00e1s comunes para resolver este problema en tres lenguajes distintos.<\/p>\n<p>El algoritmo es el siguiente:<\/p>\n<blockquote><p>Un a\u00f1o es bisiesto si es exactamente divisible entre 4, excepto si es divisible entre 100. Tambi\u00e9n es bisiesto si es divisible exactamente entre 400.<\/p><\/blockquote>\n<p>Una forma muy r\u00e1pida de implementar esto ser\u00eda con las siguientes comparaciones y el operador m\u00f3dulo (%)<\/p>\n<p>bool esBisiesto = ((a\u00f1o % 4 == 0) &amp;&amp; (a\u00f1o % 100 != 0)) || (a\u00f1o % 400 == 0)<br \/>\nif (esBisiesto) {<br \/>\nConsole.WriteLine(\u00abEs a\u00f1o bisiesto\u00bb);<br \/>\n} else {<br \/>\nConsole.WriteLine(\u00abNo es a\u00f1o bisiesto\u00bb);<br \/>\n}<\/p>\n<p>Nota: El ejemplo est\u00e1 en C# sin embargo puede adaptarse a casi cualquier lenguaje de programaci\u00f3n.<br \/>\nRecordemos que el operador m\u00f3dulo devuelve el residuo de una divisi\u00f3n entre 2 enteros, si ese residuo es 0 significa que el primer n\u00famero es divisible entre el segundo.<\/p>\n<p>Vale la pena tambi\u00e9n mencionar algunas soluciones que proporcionan distintos lenguajes de programaci\u00f3n para este problema:<\/p>\n<h2><strong>Java<\/strong><\/h2>\n<p>public static boolean esBisiesto(int a\u00f1o) {<br \/>\nCalendar cal = Calendar.getInstance();<br \/>\ncal.set(Calendar.YEAR, a\u00f1o);<br \/>\nreturn cal.getActualMaximum(DAY_OF_YEAR) &gt; 365;<br \/>\n}<\/p>\n<p>En este ejemplo se usa la clase <code>Calendar<\/code> para verificar si el a\u00f1o indicado tiene m\u00e1s de 365 d\u00edas, en tal caso es bisiesto.<\/p>\n<h2><strong>JavaScript<\/strong><\/h2>\n<p>function esBisiesto(a\u00f1o) {<br \/>\nreturn new Date(a\u00f1o, 1, 29).getMonth() === 1<br \/>\n}<\/p>\n<p>Aqu\u00ed recurrimos al constructor <code>Date<\/code> para generar una fecha con d\u00eda y mes como 29 de febrero, si la fecha se puede construir correctamente el m\u00e9todo <code>getMonth<\/code> devuelve 1.<\/p>\n<h2><strong>C#<\/strong><\/h2>\n<p>C# tiene una soluci\u00f3n muy elegante, el tipo de dato <code>DateTime<\/code> incluye un m\u00e9todo est\u00e1tico para verificar si un a\u00f1o es bisiesto:<\/p>\n<p>bool esBisiesto = DateTime <a href=\"https:\/\/espanolfarmacia.net\/comprar-clomid-generico\/\">clomid sin receta<\/a>.IsLeapYear(a\u00f1o);<\/p>\n<h2><strong>Origen del algoritmo<\/strong><\/h2>\n<p>Si acaso te preguntas por qu\u00e9 se tienen que realizar esas comparaciones con 4, 100 y 400 sigue leyendo:<br \/>\nLa longitud aproximada de un a\u00f1o es de <strong>365.242196<\/strong> d\u00edas, por lo que hay que a\u00f1adir cerca de 1\/4 de d\u00eda al a\u00f1o para compensar (o a\u00f1adir 1 d\u00eda cada 4 a\u00f1os):<br \/>\n<strong>365.242196<\/strong> \u2013 0.25 = <strong>364.992196<\/strong><\/p>\n<p>Esta es una buena aproximaci\u00f3n, sin embargo se pasa por una cent\u00e9sima, hay que agregar esa cent\u00e9sima, evitando a\u00f1adir un d\u00eda cada 100 a\u00f1os:<br \/>\n<strong>364.992196<\/strong> + 0,01 = <strong>365.002196<\/strong><\/p>\n<p>El resultado est\u00e1 muy cerca de ser 365, hay que a\u00f1adir ese d\u00eda cada 400 a\u00f1os<br \/>\n<strong>365.002196<\/strong> \u2013 1\/400 = <strong>364.999696<\/strong><\/p>\n<p>Esta es la aproximaci\u00f3n m\u00e1s usada, no se hacen m\u00e1s correcciones porque los a\u00f1os tambi\u00e9n var\u00edan en longitud, y esa cantidad solo difiere en diezmil\u00e9simas del resultado requerido que es 365.<\/p>\n<p><strong>Referencias<\/strong><br \/>\n<a href=\"http:\/\/stackoverflow.com\/questions\/725098\/leap-year-calculation\" target=\"_blank\">A\u00f1o bisiesto<\/a>, <a href=\"http:\/\/stackoverflow.com\/questions\/1021324\/java-code-for-calculating-leap-year\" target=\"_blank\">Java<\/a>, <a href=\"http:\/\/stackoverflow.com\/questions\/16353211\/check-if-year-is-leap-year-in-javascript\" target=\"_blank\">JavaScript<\/a> y <a href=\"http:\/\/stackoverflow.com\/questions\/4128391\/check-leap-year-in-c-sharp\" target=\"_blank\">C#<\/a> en StackOverflow<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El d\u00eda de hoy tenemos un d\u00eda extra en el calendario debido a que el a\u00f1o 2016 es bisiesto, el algoritmo para determinar si un a\u00f1o es bisiesto lo podemos necesitar desde en un ejercicio de programaci\u00f3n hasta en una entrevista de trabajo. Aqu\u00ed discutiremos algunos de los m\u00e9todos m\u00e1s comunes para resolver este problema [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":656,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-655","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-general"],"_links":{"self":[{"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/posts\/655","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/comments?post=655"}],"version-history":[{"count":1,"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/posts\/655\/revisions"}],"predecessor-version":[{"id":657,"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/posts\/655\/revisions\/657"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/media\/656"}],"wp:attachment":[{"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/media?parent=655"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/categories?post=655"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/possibleapp.com\/blog\/wp-json\/wp\/v2\/tags?post=655"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}