{"id":86,"date":"2008-11-17T20:49:55","date_gmt":"2008-11-17T19:49:55","guid":{"rendered":"http:\/\/www.sortea2.com\/blog\/?p=86"},"modified":"2010-11-13T13:46:21","modified_gmt":"2010-11-13T12:46:21","slug":"zonas-horarias-y-php","status":"publish","type":"post","link":"https:\/\/www.sortea2.com\/blog\/2008\/11\/zonas-horarias-y-php\/","title":{"rendered":"Zonas horarias y PHP"},"content":{"rendered":"<p><span class=\"header\">Introducci\u00f3n. M\u00e9todos sencillos que no funcionan<\/span><\/p>\n<p>Cuando escribimos <a href=\"http:\/\/www.sortea2.com\/sorteos-avanzados\">nuestra p\u00e1gina de sorteos<\/a> consideramos que ser\u00eda \u00fatil que los usuarios pudieran realizar un sorteo a una fecha y hora determinadas. Por si desean darle un poco de emoci\u00f3n o dar claridad a un sorteo. No es lo mismo que t\u00fa publiques unos resultados sino que digas \u00aben esta p\u00e1gina ofrecer\u00e1n los resultados\u00bb. Es una forma de mostrar que no influyes en el resultado.<\/p>\n<p>Al querer realizar los sorteos a una hora concreta detectamos que era problem\u00e1tica la situaci\u00f3n de cara a los usuarios que no usasen la misma zona horaria que nosotros (que es la de Espa\u00f1a). Una soluci\u00f3n ser\u00eda dar todas las fechas con nuestro horario. Es exigir a los clientes que se adapten a nuestras condiciones. Aunque hay muchos que optan por ella, me parece inadmisible.<\/p>\n<p>Nuestra primera idea fue la de mostrar un desplegable con zonas horarias, mediante una funci\u00f3n sencilla:<br \/>\nSe muestra una zona horaria e internamente se guarda un valor num\u00e9rico: el n\u00famero de horas de diferencia respecto de la hora de Madrid.<\/p>\n<p>Lisboa(-1)<br \/>\nMadrid(0)<br \/>\nCanarias(-1)<br \/>\nNueva York(-6)<br \/>\nM\u00e9xico DF (-7)<\/p>\n<p>Esta aproximaci\u00f3n es una de las m\u00e1s frecuentes. Es sencilla y f\u00e1cil de tratar. Cuando un usuario de M\u00e9xico solicita que su sorteo sea a las 13:00 horas, convertimos el horario al de Espa\u00f1a (sumamos 7 horas) y lo guardamos (20:00 horas). Luego cuando ese usuario decida consultar el sorteo, volvemos a realizar la conversi\u00f3n inversa, restando siete horas.<\/p>\n<p>Sin embargo la vida no es tan f\u00e1cil. Quiz\u00e1s el mayor de los problemas es la maligna <strong>DST <\/strong>(<em>Daylight Saving Time<\/em>, Horario de verano en castellano).<\/p>\n<p>Porque cuando nos acercamos a estos d\u00edas en que se suma o resta una hora, los resultados pueden ser impredecibles.<\/p>\n<p>a) Hay pa\u00edses que no cambian nunca de horario (sabia decisi\u00f3n). Entonces respecto a ellos habr\u00e1 veces que Espa\u00f1a tenga X horas de diferencia y el resto del a\u00f1o X +1 horas.<\/p>\n<p>b) Hay pa\u00edses que cambian de horario en fechas diferentes, como sucede con Estados Unidos. No se puede ignorar a Estados Unidos, que tiene m\u00e1s usuarios de castellano que la propia Espa\u00f1a.<br \/>\nEstados Unidos es a\u00fan m\u00e1s complejo por cuanto las elecciones presidenciales pueden cambiar la fecha en que se realice el cambio de hora. Adem\u00e1s, tiene potestad para realizar cambios en el d\u00eda seleccionado para la modificaci\u00f3n horaria, sabemos cuando cambiar\u00e1n el a\u00f1o que viene, pero dentro de tres a\u00f1os puede cambiar de sistema (ya lo han hecho varias veces). Vamos, que es todo un caso a tratar por separado.<\/p>\n<p>c) Hay pa\u00edses que incluso cambian la regla. Muchos pa\u00edses decidieron dejar de cambiar de hora hace alg\u00fan tiempo. De cara al futuro no es problem\u00e1tico pero si queremos hacer una correcta conversi\u00f3n de fechas, su situaci\u00f3n debe ser tenida en cuenta.<\/p>\n<p>d) Hay pa\u00edses que no tienen zonas horarias exactas. Ya sea porque tengan diferencias de cuarto de hora respecto de una zona (como Nepal, +5:45) o Venezuela (-4:30). Adem\u00e1s, el caso de Venezuela, en que dicho cambio de zona horaria es muy actual, es problem\u00e1tico para fechas del pasado reciente.<\/p>\n<p>Por todas estas razones, <strong>el m\u00e9todo de sumar o restar horas, sencillamente no sirve<\/strong>.<\/p>\n<p><span class=\"header\"><br \/>\nZonas horarias y PHP<\/span><\/p>\n<p>Para nuestro caso, al estar desarrollada la p\u00e1gina con PHP, tras buscar soluciones posibles por Internet, sin mucho \u00e9xito y tratando de hacer alguna cosa bien, optamos por mirar algunas funciones propias de PHP.<\/p>\n<p>Las <a href=\"http:\/\/es.php.net\/manual\/en\/ref.datetime.php\">funciones propias de PHP para zonas horarias<\/a> en la versi\u00f3n actual (4.4) son las siguientes:<\/p>\n<ul> # timezone_abbreviations_list<br \/>\n# timezone_identifiers_list<br \/>\n# timezone_name_from_abbr<br \/>\n# timezone_name_get<br \/>\n# timezone_offset_get<br \/>\n# timezone_open<br \/>\n# timezone_transitions_get<\/ul>\n<p>No creemos que sea necesario dar una enumeraci\u00f3n de las mismas, m\u00e1xime cuando se puede consultar la completa documentaci\u00f3n online. Lo importante es saber que la forma en que PHP guarda las zonas horarias. Aunque hay posibles conversiones de texto (siempre m\u00e1s f\u00e1ciles si el texto est\u00e1 en ingl\u00e9s), lo suyo es usar los pares Continente\/Pa\u00eds que presenta PHP en su <a href=\"http:\/\/es.php.net\/timezones\">lista de zonas horarias soportadas<\/a>.<\/p>\n<p>Por ejemplo:<\/p>\n<ul> Europe\/Madrid<br \/>\nAmerica\/Mexico_City<br \/>\nAmerica\/Buenos_Aires<br \/>\nAtlantic\/Canary<\/ul>\n<p>La lista de zonas horarias admitidas es extens\u00edsima. En muchos casos estas zonas horarias son id\u00e9nticas, como sucede con Madrid, Berl\u00edn o Par\u00eds. De ah\u00ed que no tenga mucho sentido mostrar desplegables casi infinitos en sus posibilidades (s\u00f3lo <a href=\"http:\/\/es.php.net\/manual\/en\/timezones.antarctica.php\">para la Ant\u00e1rtida<\/a> PHP soporta \u00a1Ocho zonas horarias!).<\/p>\n<p>Se realiza una selecci\u00f3n de pa\u00edses y ciudades representativas. Lo ideal es mostrar junto a dicha ciudad la zona horaria correspondiente para que as\u00ed un usuario de un lugar rec\u00f3ndito pueda localizar la zona que mejor se adapte a su ubicaci\u00f3n:<\/p>\n<ul> Buenos Aires (GMT -3)<\/p>\n<p>La Paz (GMT -4)<br \/>\nCaracas (GMT -4.5)<br \/>\nMontreal (GMT -5)<\/ul>\n<figure id=\"attachment_104\" aria-describedby=\"caption-attachment-104\" style=\"width: 399px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.sortea2.com\/sorteos-avanzados\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-104\" title=\"zonas-horarias-php\" src=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/zonas-horarias-php.jpg\" alt=\"Desplegable zonas horarias\" width=\"399\" height=\"510\" \/><\/a><figcaption id=\"caption-attachment-104\" class=\"wp-caption-text\">Desplegable zonas horarias<\/figcaption><\/figure>\n<p>Por lo tanto, trabajamos con tres valores:<\/p>\n<p>a) El <strong>c\u00f3digo<\/strong> de zona horaria de PHP: America\/Buenos_Aires<br \/>\nb) La <strong>descripci\u00f3n<\/strong> para seres humanos de dicha zona: Buenos Aires<br \/>\nc) Un <strong>indicativo<\/strong> para usuarios que no encajen exactamente con dicho pa\u00eds: GMT -3<\/p>\n<p>Esto ya sugiere que crear una tabla donde se guarde la informaci\u00f3n de las zonas horarias puede ser de gran ayuda.<\/p>\n<p>Si te interesa la que usamos en nuestra p\u00e1gina, <a href=\"http:\/\/www.sortea2.com\/blog\/wp-content\/images\/timezone-tabla-php.txt\">puedes descarg\u00e1rtela de aqu\u00ed, <\/a>en formato de creaci\u00f3n para MySQL (f\u00e1cilmente adaptable a otras bases de datos).<\/p>\n<p><span class=\"header\"><br \/>\nZonas horarias. \u00bfQu\u00e9 convertimos?<\/span><\/p>\n<p>Antes de continuar una buena tarea sobre la que meditar es c\u00f3mo vamos a guardar las fechas y horas en nuestra base de datos. Si nos centramos en la ciudad en que vivimos, nos podemos encontrar con que el servidor que alberga nuestra p\u00e1gina est\u00e9 ubicado en otra zona horaria. Cierto es que a veces podemos manipular esta hora, pero en hostings compartidos, a veces esto no es posible.<\/p>\n<p>As\u00ed, uno puede encontrase con que:<\/p>\n<p>a) Su zona horaria es de Madrid, Espa\u00f1a.<br \/>\nb) Quiere guardar una fecha y hora de Canarias, Espa\u00f1a.<br \/>\nc) El servidor est\u00e1 situado en Los \u00c1ngeles, Estados Unidos.<\/p>\n<p>Con lo cual los problemas est\u00e1n casi garantizados.<\/p>\n<p>Tampoco hay que volverse loco ante las diferencias de fechas. Salvo que tengas una situaci\u00f3n tan especial como la nuestra, en que necesitamos programar tareas futuras, quiz\u00e1s puedas sobrevivir sin problemas y sin saber nada de todo esto. Pero el conocimiento siempre es \u00fatil.<\/p>\n<p>En las tablas de datos es com\u00fan guardar un registro con la fecha y hora de la \u00faltima modificaci\u00f3n. \u00bfDebemos convertir esa fecha y hora?<\/p>\n<p>Pues salvo que sean tareas cr\u00edticas, probablemente no. Las fechas de creaci\u00f3n de registro bien se pueden quedar en el horario que tenga el servidor. S\u00f3lo aquellas que requieran de ser mostradas en pantalla pueden y deben ser tratadas con mayor consideraci\u00f3n. En el caso de sortea2.com, las horas a las que se programan los sorteos. Para ellas no s\u00f3lo se guardar\u00e1 la fecha y hora, sino tambi\u00e9n la zona horaria en que se realizaron.<\/p>\n<p>Por lo tanto, por sentido com\u00fan, no es muy l\u00f3gico guardarlas en una horario tan poco est\u00e1ndar como el de Madrid. Hay dos opciones principales:<\/p>\n<ul> Guardar la hora y decir \u00abson las 14:30 con el horario de Buenos Aires\u00bb.<br \/>\nConvertirla al estandar GMT (Hora de Greenwich, Inglaterra) e indicar la zona horaria deseada. \u00abson las 16:30, zona horaria preferida Buenos Aires\u00bb.<\/ul>\n<p>Esta segunda opci\u00f3n nos parece mejor porque permite en un momento dado comparar fechas de inmediato. Del otro modo casi siempre habr\u00e1 que hacer una conversi\u00f3n antes de poder continuar.<\/p>\n<p>Como <strong>resumen<\/strong>: se guardan las horas en estandar GMT, s\u00f3lo en los casos en que no sean necesarias manipulaciones posteriores.<\/p>\n<p><span class=\"header\"><br \/>\nZonas horarias y PHP. Las transiciones.<\/span><\/p>\n<p>Tras planear el desarrollo de la p\u00e1gina, s\u00f3lo queda un problema: c\u00f3mo convertir entre dos zonas horarias dadas. No s\u00e9 c\u00f3mo lo habr\u00e1n desarrollado en otros lenguajes de programaci\u00f3n, pero en PHP el m\u00e9todo es realmente <strong>ingenioso y complicado<\/strong>.<\/p>\n<p>Vaya por delante que en internet hay numerosas clases realizadas por otros que explican c\u00f3mo realizar estos cambios. Hay incluso clases hechas en PEAR que se supone son totalmente est\u00e1ndar. Tras la nefasta experiencia de usar una de ellas y descubrir que estaba mal (no distingu\u00eda los cambios de hora), decid\u00ed seguir el camino dif\u00edcil y propio.<\/p>\n<p>Siempre es m\u00e1s f\u00e1cil usar algo ya hecho y que funcione. Y uno puede vivir dignamente sin conocer las transiciones de PHP.<\/p>\n<p>Pero si quieres continuar, las transiciones son un array de fechas correspondiente a cada una de las zonas horarias. Es un array monstruoso en que se muestran los d\u00edas del a\u00f1o en que se produce un cambio de hora para dicha zona horaria. Por ejemplo, para la zona horaria Europe\/Madrid dice:<\/p>\n<p>( [0] =&gt; Array ( [ts] =&gt; -1661734800 [time] =&gt; 1917-05-05T23:00:00+0000 [offset] =&gt; 3600 [isdst] =&gt; 1 [abbr] =&gt; WEST )<\/p>\n<p>Que traducido al cristiano es algo as\u00ed como:<\/p>\n<ul>\n<li>A la fecha y hora UNIX (segundos desde el 1 de enero de 1970) (correspondiente a GMT, hora estandar de Greenwich) es la de -1661734800).<\/li>\n<li>Que se corresponde con la fecha y hora \u00aben ingl\u00e9s\u00bb de 1917-05-05 23:00:00+0000.<\/li>\n<li>Se produjo un cambio de hora que deja a la hora de Madrid respecto de la de GMT en 3600 segundos (una hora m\u00e1s).<\/li>\n<li>Dejando la zona horaria en GMT+1.<\/li>\n<li>Quedando en la zona horaria la WEST.<\/li>\n<\/ul>\n<p>El listado de transiciones de la zona horaria de Madrid nos avisa de cada cambio de hora que se ha producido en la historia, desde el verano de 1917 hasta el a\u00f1o 2037. Si se necesita tratar fechas anteriores o posteriores, aparte de considerar la opci\u00f3n del suicidio, habr\u00eda que tirar de enciclopedias y realizar un tedioso trabajo manual.<\/p>\n<p>Este extens\u00edsimo array <strong>es la pieza fundamental para realizar conversiones entre zonas horarias en PHP.<\/strong><\/p>\n<p>Veamos por ahora c\u00f3mo obtener el fichero de transiciones para una zona horaria:<\/p>\n<p>$timezone = \u00abEurope\/Madrid\u00bb;<br \/>\n$timezoneinfo = new DateTimeZone($timezone);<br \/>\n$arraytime = $timezoneinfo-&gt;getTransitions();<\/p>\n<p>En la <strong>primera l\u00ednea<\/strong> definimos la zona horaria a tratar, seg\u00fan las zonas horarias que PHP entiende.<\/p>\n<p>En la <strong>segunda<\/strong> creamos un objeto de tipo zona horaria, relativo a dicha zona inicial.<\/p>\n<p>En la <strong>tercera<\/strong> obtenemos las transiciones: cu\u00e1ndo se produjeron los cambios de hora respecto de GMT para esa zona horaria.<\/p>\n<p>Es curioso ver el fichero de transiciones. Ahora solemos cambiar de hora los s\u00e1bados de 2:00 am a 3:00 am, pero en 1917 decidieron hacerlo a las 0:00 horas. Se nota que se trasnochaba menos por aquel entonces. Durante la II Guerra Mundial hubo cambios de hora a las 11:00 de la noche. Luego se volvi\u00f3 a las 12:00 y en los ochenta se pas\u00f3 a hacerlo a la 1:00 am.<\/p>\n<p>Como podemos ver, y evitemos dispersarnos, los cambios de hora son una verdadera pesadilla en lo que al <strong>horario de verano<\/strong> se refiere.<\/p>\n<p>Con el array de transiciones ya es m\u00e1s o menos f\u00e1cil. Si tenemos una fecha en formato GMT, junto con una zona horaria deseada y deseamos convertirla a la hora propiamente dicha, basta con:<\/p>\n<p>Tomamos la hora en GMT y recorremos el array de transiciones, hasta que encontramos una hora superior a la nuestra.<br \/>\nPor ejemplo, si tenemos las 20:00 del 15 de Enero de 2012, y el horario deseado es el de Madrid, vemos que el \u00faltimo cambio de horas se produce el 30 de octubre del 2011. Y que entonces Espa\u00f1a tendr\u00e1 una hora m\u00e1s que la hora GMT. Esto suceder\u00e1 as\u00ed hasta el 25 de Marzo del 2012, por lo que efectivamente, si queremos convertir esa hora en GMT a hora de Madrid, debemos sumarle una hora (3600 segundos) m\u00e1s.<\/p>\n<p>[110] =&gt; Array ( [ts] =&gt; 1319936400 [time] =&gt; 2011-10-30T01:00:00+0000 [offset] =&gt; 3600 [isdst] =&gt; [abbr] =&gt; CET )<br \/>\n[111] =&gt; Array ( [ts] =&gt; 1332637200 [time] =&gt; 2012-03-25T01:00:00+0000 [offset] =&gt; 7200 [isdst] =&gt; 1 [abbr] =&gt; CEST )<\/p>\n<p>Este proceso es mucho m\u00e1s delicado si la hora est\u00e1 en el mismo borde del cambio de hora. Por ejemplo, si queremos convertir las 01:00 horas del 25 de marzo de 2012, de horario GMT al horario de Madrid.<\/p>\n<p>Para afinar completamente la regla es la siguiente:<\/p>\n<ul>\n<li>Partimos de una hora.<\/li>\n<li>Recorremos las transiciones hasta pasarnos de dicha hora.<\/li>\n<li>Miramos el registro anterior. Obtenemos la diferencia de segundos.<\/li>\n<li>Se la sumamos a la hora que ten\u00edamos. Si nos hemos pasado de la siguiente transici\u00f3n, tomamos esa siguiente, sino (lo habitual) nos quedamos con la que ten\u00edamos.<\/li>\n<\/ul>\n<p>La verdad es que esto se entiende mejor con el c\u00f3digo que escrito con palabras:<\/p>\n<div id=\"codigo\">$timezoneinfo = <span class=\"verde\">new<\/span> <span class=\"funciones_php\">DateTimeZone<\/span>($timezone);<br \/>\n$arraytime = $timezoneinfo<span class=\"funciones_php\">-&gt;<\/span>getTransitions();<\/p>\n<p>$i = <span class=\"punto\">&#8211;<\/span><span class=\"numero\">1<\/span>;<\/p>\n<p><span class=\"verde\">foreach<\/span> ($arraytime <span class=\"verde\">as<\/span> $transicion)<br \/>\n{<br \/>\n<span class=\"indented\">$i <span class=\"punto\">++<\/span>;<\/span><br \/>\n<span class=\"indented\"><span class=\"verde\">if<\/span> ($transicion[ts] + $arraytime[$i][offset] &gt;= $gmttime)<\/span><br \/>\n<span class=\"indented\">{<\/span><br \/>\n<span class=\"indented\">$indice = $i &#8211;<span class=\"numero\">1<\/span>;<\/span><br \/>\n<span class=\"indented\"><span class=\"verde\">break<\/span>;<\/span><br \/>\n<span class=\"indented\">}<\/span><br \/>\n}<br \/>\n$newtime = $gmttime <span class=\"punto\">+<\/span> $arraytime[$indice][offset];<\/div>\n<p>Nos recorremos el array de transiciones. Cuando la transici\u00f3n + las horas de diferencia sean mayores que nuestra fecha de partida, quiere decir que hemos llegado y es el momento de tomar ese valor, sumarlo a la fecha que ten\u00edamos y voil\u00e1, ya hemos convertido la fecha.<\/p>\n<p><span class=\"header\">Zonas horarias y PHP. Funciones de conversi\u00f3n.<\/span><\/p>\n<p>B\u00e1sicamente ya hemos expuesto todo el proceso. Lo \u00fanico necesario son dos funciones: una que parta de una zona horaria y una hora expresada en dicha zona horaria y la transforme en GMT y otra que partiendo de una hora en GMT y una zona horaria, realice la transformaci\u00f3n inversa.<\/p>\n<p>Pueden servir las dos siguientes funciones:<\/p>\n<div id=\"codigo\"><span class=\"funciones_php\">function<\/span> of_gmttolocaltime ($gmttime, $timezone)<br \/>\n{<br \/>\n$timezoneinfo = <span class=\"verde\">new<\/span> <span class=\"funciones_php\">DateTimeZone<\/span>($timezone);<br \/>\n$arraytime = $timezoneinfo<span class=\"funciones_php\">-&gt;<\/span>getTransitions();<\/p>\n<p>$i = <span class=\"punto\">&#8211;<\/span><span class=\"numero\">1<\/span>;<\/p>\n<p><span class=\"verde\">foreach<\/span> ($arraytime <span class=\"verde\">as<\/span> $transicion)<br \/>\n{<br \/>\n<span class=\"indented\">$i <span class=\"punto\">++<\/span>;<\/span><br \/>\n<span class=\"indented\"><span class=\"verde\">if<\/span> ($transicion[ts] + $arraytime[$i][offset] &gt;= $gmttime)<\/span><br \/>\n<span class=\"indented\">{<\/span><br \/>\n<span class=\"indented\"><span class=\"indented\">$indice = $i &#8211;<span class=\"numero\">1<\/span>;<\/span><\/span><br \/>\n<span class=\"indented\"><span class=\"indented\"><span class=\"verde\">break<\/span>;<\/span><\/span><br \/>\n<span class=\"indented\">}<\/span><br \/>\n}<br \/>\n$newtime = $gmttime <span class=\"punto\">+<\/span> $arraytime[$indice][offset];<br \/>\n<span class=\"verde\">return<\/span> $newtime;<br \/>\n}<\/div>\n<div id=\"codigo\"><span class=\"comentario\">\/**<br \/>\n* Entrada. Una hora en formato UNIX de una zona horaria, y el nombre de la zona horaria.<br \/>\n* Salida. La hora convertida a GMT.<br \/>\n*\/<\/span><br \/>\n<span class=\"funciones_php\">function<\/span> of_localtimetogmt ($localtime, $timezone)<br \/>\n{<br \/>\n$timezoneinfo = <span class=\"verde\">new<\/span> DateTimeZone($timezone);<br \/>\n$arraytime = $timezoneinfo-&gt;getTransitions();<\/p>\n<p>$i = &#8211;<span class=\"numero\">1<\/span>;<\/p>\n<p><span class=\"verde\">foreach<\/span> ($arraytime <span class=\"verde\">as<\/span> $transicion)<br \/>\n{<br \/>\n<span class=\"indented\">$i <span class=\"punto\">++<\/span>;<\/span><br \/>\n<span class=\"indented\"><span class=\"verde\">if<\/span> ($transicion[ts] &#8211; $arraytime[$i][offset]&gt;= $localtime)<\/span><br \/>\n<span class=\"indented\">{<\/span><br \/>\n<span class=\"indented\">$indice = $i &#8211;<span class=\"numero\">1<\/span>;<\/span><br \/>\n<span class=\"indented\"><span class=\"verde\">break<\/span>;<\/span><br \/>\n<span class=\"indented\">}<\/span><br \/>\n}<br \/>\n$newtime = $localtime &#8211; $arraytime[$indice][offset];<br \/>\n<span class=\"verde\">return<\/span> $newtime;<br \/>\n}<\/div>\n<p>Las horas siempre se expresan en horario UNIX. \u00a1Bastante quebradero de cabeza dan las zonas horarias para sufrir a\u00fan m\u00e1s con los formatos locales de fecha y hora!<\/p>\n<p>Creo que ha quedado todo bien expresado pero si tienes alguna duda o aclaraci\u00f3n d\u00e9jala en los comentarios. Las correcciones tambi\u00e9n son bienvenidas.<\/p>\n<p><strong>Actualizaci\u00f3n<\/strong>. Tras dos a\u00f1os usando este sistema hemos visto bastantes claroscuros que exponemos en esta otra entrada: <a href=\"http:\/\/www.sortea2.com\/blog\/2010\/11\/zonas-horarias-con-php\/\">problemas con las zonas horarias y PHP<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n. M\u00e9todos sencillos que no funcionan Cuando escribimos nuestra p\u00e1gina de sorteos consideramos que ser\u00eda \u00fatil que los usuarios pudieran realizar un sorteo a una fecha y hora determinadas. Por si desean darle un poco de emoci\u00f3n o dar claridad a un sorteo. No es lo mismo que t\u00fa publiques unos resultados sino que digas [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[55,5],"tags":[],"class_list":["post-86","post","type-post","status-publish","format-standard","hentry","category-php-2","category-tutoriales"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/86","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/comments?post=86"}],"version-history":[{"count":17,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/86\/revisions"}],"predecessor-version":[{"id":690,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/posts\/86\/revisions\/690"}],"wp:attachment":[{"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/media?parent=86"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/categories?post=86"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sortea2.com\/blog\/wp-json\/wp\/v2\/tags?post=86"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}