<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Madison Junior</title>
    <description>The latest articles on DEV Community by Madison Junior (@madison_junior_8ff1ef9de4).</description>
    <link>https://dev.to/madison_junior_8ff1ef9de4</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4245411%2F8b34deb1-ff7c-41b8-a5f7-f84283964a72.png</url>
      <title>DEV Community: Madison Junior</title>
      <link>https://dev.to/madison_junior_8ff1ef9de4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/madison_junior_8ff1ef9de4"/>
    <language>en</language>
    <item>
      <title>Cómo calcular las horas de luz con Python sin usar una API</title>
      <dc:creator>Madison Junior</dc:creator>
      <pubDate>Sun, 15 Nov 2026 05:24:05 +0000</pubDate>
      <link>https://dev.to/madison_junior_8ff1ef9de4/como-calcular-las-horas-de-luz-con-python-sin-usar-una-api-2gib</link>
      <guid>https://dev.to/madison_junior_8ff1ef9de4/como-calcular-las-horas-de-luz-con-python-sin-usar-una-api-2gib</guid>
      <description>&lt;h1&gt;
  
  
  Cómo calcular las horas de luz con Python sin usar una API
&lt;/h1&gt;

&lt;p&gt;Hace poco estuve repasando algunas operaciones con fechas y horas en Python y encontré un ejemplo bastante práctico: calcular cuánto dura el día a partir de las horas de salida y puesta del Sol.&lt;/p&gt;

&lt;p&gt;No necesitamos instalar bibliotecas externas ni conectarnos a ningún servicio. Para este ejercicio, basta con dos horarios y el módulo &lt;code&gt;datetime&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Eso sí, hay una diferencia importante: &lt;strong&gt;vamos a calcular la duración entre dos horas conocidas, no a predecir astronómicamente cuándo sale o se pone el Sol&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Imaginemos que tenemos estos datos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amanecer: 07:15&lt;/li&gt;
&lt;li&gt;Puesta del Sol: 18:42&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;¿Cuántas horas de luz hay entre ambos momentos?&lt;/p&gt;

&lt;p&gt;Podríamos hacer la resta manualmente, pero resulta más interesante crear una función reutilizable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Primera versión con Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="n"&gt;amanecer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"07:15"&lt;/span&gt;
&lt;span class="n"&gt;atardecer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"18:42"&lt;/span&gt;

&lt;span class="n"&gt;formato&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"%H:%M"&lt;/span&gt;

&lt;span class="n"&gt;inicio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amanecer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;formato&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;atardecer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;formato&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;duracion&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;inicio&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duracion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resultado es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;11:27:00
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funciona, pero podemos mejorar la salida para que sea más fácil de leer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Una función reutilizable
&lt;/h2&gt;

&lt;p&gt;Vamos a encapsular el cálculo y devolver el resultado en horas y minutos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;horas_de_luz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amanecer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;atardecer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;formato&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"%H:%M"&lt;/span&gt;

    &lt;span class="n"&gt;inicio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amanecer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;formato&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;atardecer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;formato&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;inicio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;diferencia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;inicio&lt;/span&gt;

    &lt;span class="n"&gt;minutos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diferencia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;total_seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;horas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;minutos_restantes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;divmod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minutos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;"{horas} h {minutos_restantes} min"&lt;/span&gt;


&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;horas_de_luz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"07:15"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"18:42"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;horas_de_luz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"06:30"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"20:10"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;11 h 27 min
13 h 40 min
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La función utiliza &lt;code&gt;strptime()&lt;/code&gt; para convertir las cadenas de texto en objetos de fecha y hora.&lt;/p&gt;

&lt;p&gt;Después calcula la diferencia y la transforma en minutos.&lt;/p&gt;

&lt;p&gt;Con &lt;code&gt;divmod()&lt;/code&gt; obtenemos las horas completas y los minutos restantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué comprobamos si la hora final es menor?
&lt;/h2&gt;

&lt;p&gt;En una resta de horarios puede aparecer un valor negativo cuando el segundo horario corresponde al día siguiente.&lt;/p&gt;

&lt;p&gt;La comprobación permite manejar ese caso como un intervalo general.&lt;/p&gt;

&lt;p&gt;Sin embargo, para calcular horas reales de luz es preferible trabajar con fechas completas y zonas horarias correctas. Este ejemplo utiliza únicamente horarios simplificados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Una limitación importante
&lt;/h2&gt;

&lt;p&gt;El programa no conoce la ubicación geográfica.&lt;/p&gt;

&lt;p&gt;Tampoco considera la fecha, la latitud ni la longitud. Por eso no puede determinar automáticamente la hora del amanecer.&lt;/p&gt;

&lt;p&gt;Si quisiéramos desarrollar una aplicación completa, necesitaríamos incorporar cálculos astronómicos o una fuente externa de datos solares.&lt;/p&gt;

&lt;p&gt;Para explorar información relacionada con estos fenómenos, existe el sitio &lt;a href="https://atardecer-dehoy.com/" rel="noopener noreferrer"&gt;Atardecer de Hoy&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué podríamos añadir después?
&lt;/h2&gt;

&lt;p&gt;El siguiente paso sería trabajar con fechas reales y objetos &lt;code&gt;datetime&lt;/code&gt; que incluyan información de zona horaria.&lt;/p&gt;

&lt;p&gt;También podríamos guardar los resultados diarios en un archivo CSV y representar gráficamente cómo cambia la duración del día a lo largo de varios meses.&lt;/p&gt;

&lt;p&gt;Sería un proyecto interesante para practicar Python, procesamiento de fechas y visualización de datos sin empezar con una aplicación demasiado compleja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;A veces, un ejercicio pequeño resulta suficiente para practicar conceptos útiles.&lt;/p&gt;

&lt;p&gt;En este caso hemos utilizado &lt;code&gt;datetime&lt;/code&gt;, operaciones con intervalos y &lt;code&gt;divmod()&lt;/code&gt; para resolver un problema cotidiano.&lt;/p&gt;

&lt;p&gt;Y lo mejor es que podemos reutilizar la función en otros proyectos que necesiten calcular diferencias entre horarios.&lt;/p&gt;

</description>
      <category>code</category>
      <category>programming</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
