<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Bitácora de Vuelo (Publicaciones sobre zonas horarias)</title><link>http://blog.taniquetil.com.ar/</link><description></description><atom:link href="http://blog.taniquetil.com.ar/categories/zonas-horarias.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2023 &lt;a href="mailto:facundo@taniquetil.com.ar"&gt;Facundo Batista&lt;/a&gt; CC BY-NC-SA</copyright><lastBuildDate>Mon, 29 May 2023 18:52:00 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>En tu cara, planeta redondo</title><link>http://blog.taniquetil.com.ar/posts/0741/</link><dc:creator>Facundo Batista</dc:creator><description>&lt;p&gt;Ejercicio de Python. El objetivo es tener una serie de timestamps, en función de un registro "tipo cron" que indique periodicidad, desde un punto de partida, hasta "ahora".&lt;/p&gt;
&lt;p&gt;El problema es que el "ahora" es de Buenos Aires, mientras que el servidor está en Holanda (o podría estar en cualquier lado).&lt;/p&gt;
&lt;p&gt;Lo resolvemos con &lt;a class="reference external" href="https://pypi.python.org/pypi/pytz"&gt;pytz&lt;/a&gt; y &lt;a class="reference external" href="https://pypi.python.org/pypi/croniter"&gt;croniter&lt;/a&gt;. Veamos...&lt;/p&gt;
&lt;p&gt;Arranquemos un intérprete interactivo dentro de un virtualenv con las dos libs que acabo de mencionar (y las importamos, además de datetime):&lt;/p&gt;
&lt;pre class="literal-block"&gt;$ fades -d pytz -d croniter
*** fades ***  2017-07-26 18:27:20,009  INFO     Hi! This is fades 6.0, automatically managing your dependencies
*** fades ***  2017-07-26 18:27:20,009  INFO     Need to install a dependency with pip, but no builtin, doing it manually...
*** fades ***  2017-07-26 18:27:22,979  INFO     Installing dependency: 'pytz'
*** fades ***  2017-07-26 18:27:24,431  INFO     Installing dependency: 'croniter'
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
&amp;gt;&amp;gt;&amp;gt; import croniter
&amp;gt;&amp;gt;&amp;gt; import pytz
&amp;gt;&amp;gt;&amp;gt; import datetime&lt;/pre&gt;
&lt;p&gt;Veamos que el server tiene horarios "complicados" (en el momento de hacer esto, acá en Buenos Aires son las 18:09):&lt;/p&gt;
&lt;pre class="literal-block"&gt;&amp;gt;&amp;gt;&amp;gt; datetime.datetime.now()
datetime.datetime(2017, 7, 26, 23, 9, 51, 476140)
&amp;gt;&amp;gt;&amp;gt; datetime.datetime.utcnow()
datetime.datetime(2017, 7, 26, 21, 9, 56, 707279)&lt;/pre&gt;
&lt;p&gt;Instanciemos croniter, indicando repeticiones todas las horas a las 20 (a propósito, de manera que cuando iteremos desde hace una semana hasta "ahora", debería llegar hasta ayer, porque ahora son las 18 y pico acá, pero justo UTC o la hora del server son más que las 20...):&lt;/p&gt;
&lt;pre class="literal-block"&gt;&amp;gt;&amp;gt;&amp;gt; cron = croniter.croniter("0 20 * * * ", datetime.datetime(year=2017, month=7, day=20))&lt;/pre&gt;
&lt;p&gt;Pidamos la hora UTC actual, agregándole metadata de que es UTC, justamente:&lt;/p&gt;
&lt;pre class="literal-block"&gt;&amp;gt;&amp;gt;&amp;gt; utc_now = pytz.utc.localize(datetime.datetime.utcnow())
&amp;gt;&amp;gt;&amp;gt; utc_now
datetime.datetime(2017, 7, 26, 21, 15, 27, 508732, tzinfo=&amp;lt;UTC&amp;gt;)&lt;/pre&gt;
&lt;p&gt;Pidamos un timezone para Buenos Aires, y el "ahora" de antes pero calculado para esta parte del planeta:&lt;/p&gt;
&lt;pre class="literal-block"&gt;&amp;gt;&amp;gt;&amp;gt; bsas_tz = pytz.timezone("America/Buenos_Aires")
&amp;gt;&amp;gt;&amp;gt; bsas_now = utc_now.astimezone(bsas_tz)
&amp;gt;&amp;gt;&amp;gt; bsas_now
datetime.datetime(2017, 7, 26, 18, 15, 27, 508732, tzinfo=&amp;lt;DstTzInfo 'America/Buenos_Aires' -03-1 day, 21:00:00 STD&amp;gt;)&lt;/pre&gt;
&lt;p&gt;Ahora hagamos un loop, pidiendo las fechas a &lt;em&gt;cron&lt;/em&gt; y mostrándola, mientras que no sea más que ahora (notar que para compararla, hay que localizarla con el mismo timezone):&lt;/p&gt;
&lt;pre class="literal-block"&gt;&amp;gt;&amp;gt;&amp;gt; while True:
...     next_ts = cron.get_next(datetime.datetime)
...     bsas_next_ts = bsas_tz.localize(next_ts)
...     if bsas_next_ts &amp;gt; bsas_now:
...         break
...     print(bsas_next_ts)
...
2017-07-20 20:00:00-03:00
2017-07-21 20:00:00-03:00
2017-07-22 20:00:00-03:00
2017-07-23 20:00:00-03:00
2017-07-24 20:00:00-03:00
2017-07-25 20:00:00-03:00&lt;/pre&gt;
&lt;p&gt;Vemos que tuvimos fechas arrancando el 20 de julio, y tenemos "varios días a las 20hs" hasta ayer, porque todavía no es "hoy a las 20hs". ¡Listo!&lt;/p&gt;</description><category>Python</category><category>timezones</category><category>zonas horarias</category><guid>http://blog.taniquetil.com.ar/posts/0741/</guid><pubDate>Thu, 27 Jul 2017 00:23:00 GMT</pubDate></item></channel></rss>