Tuesday 26 April 2011

Hora actual en cierto TimeZone con PHP5 usando date_create()

Tal vez te haya tocado pelearte con el tema de las zonas horarias... y sabrás que es un auténtico embrollo. Después de haber probado varios métodos, finalmente hallé para mis aplicaciones una manera bien sencilla, que aprovecho para compartir aquí.

El problema se trata de lo siguiente: necesito saber la hora actual en cierta zona horaria, teniendo en cuenta obviamente los cambios de hora para verano.

La solución:

1  <?php
2  
3       $timeZone 
"America/Hermosillo";
4       
$o_date date_create(nulltimezone_open($timeZone));
5       
$local_time date_format($o_date'd/m/Y H:i');
6            
7       echo 
"Time at ".$timeZone.": ".$local_time;
8            
9       
// will produce something like this
10       //
11       // Time at America/Hermosillo: 26/04/2011 13:32 
12  
13  
?>


Si en nuestro servidor poseemos una versión de PHP >= 5.3 podemos trabajar con una variante de lo anterior en la que usamos la función date_create_from_format() para crear el objeto de fecha $o_date a partir de cualquier fecha y hora en cualquier formato!!!

1  <?php
2  
3       $timeZone 
"America/Hermosillo";
4       
$o_date date_create_from_format('Y-m-d H:i','2011-04-26 00:00'timezone_open($timeZone));
5       
$local_time date_format($o_date'd/m/Y H:i');
6            
7       echo 
"Time at ".$timeZone.": ".$local_time;
8            
9       
// will produce something like this
10       //
11       // Time at America/Hermosillo: 25/04/2011 15:00 
12  
13  
?>


El inconveniente a día de hoy (Abril 2011) es que pocos servidores han actualizado aún a esa versión (el mío no, por ejemplo). En ese caso, este otro código que trabaja con objetos DateTime en lugar de con funciones, no es mucho más complicado pero nos aporta una nueva ventaja: podemos usar como "hora" a traducir cualquiera que esté en el formato Y-m-d H:i

1  <?php
2  
3       $timeZone 
'America/hermosillo';
4       
$dateTime = new DateTime('2011-04-26 00:00');
5       
$dateTime->setTimeZone(new DateTimeZone($timeZone));
6       
$local_time=$dateTime->format('d/m/Y H:i');
7  
8       echo 
"Time at ".$timeZone.": ".$local_time;
9  
10       
// will produce something like this
11       // (in a Server at 'Europe/Madrid')
12       //
13       // Time at America/Hermosillo: 25/04/2011 15:00
14        
15  
?> 


Es decir, resumiendo, el primer código que he presentado va excelente para calcular la hora en este momento en cualquier zona horaria del globo. Y el último código, nos es útil para calcular la hora en cualquier zona horaria a partir de cualquier otra fecha/hora de nuestro servidor ;)

Estoy seguro que a más de uno le ayudará esto. Aunque en realidad sé que la cosa aún puede complicarse más, y de hecho, si uno quiere que su aplicación web sea realmente "multi-horaria" (para el visitante, para la base de datos, etc...) la cosa puede ser un tanto surrealista. Una buena recomendación al respecto que leí hace unos meses es: guardar en tu base de datos fechas y horas en formato GMT, para a partir de ahí "traducirlo" al uso horario que necesites en cada momento, independientemente de que coloques tu aplicación en un servidor de una zona horaria u otra.

Suerte!
Salud!
SERGI

Friday 8 April 2011

Formatear código para publicar en blog

Habrás llegado aquí posiblemente buscando cómo poder publicar trozos de código en los artículos de tu blog o en tu propia web de documentación de software, etc... Ya sabes: con colores que destaquen la sintaxis del código y hagan más legible el código que publicas.

Pues bien, en mi caso me sucedió lo mismo. Y al final la solución aceptable que asumí para mi uso personal es la que comparto aquí con vosotros. Es un pequeño código de PHP que he colgado en uno de mis dominios y que podéis ver aquí abajo.

¿Qué hace? simplemente muestra una casilla textarea para introducir el código que quieres formatear, pulsas un botón "send" y se recarga la página con otro textarea con él código ya formateado y listo para copiar y pegar en tu blog, además de mostrar debajo el aspecto de cómo quedará ;) Así puedes hacer varios "intentos" hasta que veas que te guste.

No voy a echarme muchos méritos pero sí los que merezco: tomé de base un código muy parecido que hacía casi lo mismo, pero lo he mejorado en muchos aspectos, tanto en el formateado en sí como en la usabilidad de la "aplicación". Por ejemplo, el original no presentaba el segundo textarea para copiar y pegar el código sino que había que ver "el código fuente" de la página para copiarlo :( Y también tenía errores en el coloreado de los números de línea.

En fin, disfrútenlo:
1  <?php
2    
if( !empty( $_POST['codigo'] ) ) {
3         
$codigo $_POST['codigo'];
4         
$codigo str_replace"\t""     "$codigo );
5         
$codigo highlight_stringstripslashes$codigo ), true );
6         
$line 1;
7         
$buffer = array();
8         
$cod explode"<br />"$codigo );
9         foreach( 
$cod as $codLine ) {
10              
$buffer[] = "<b style='color:#888!important;'>".$line."</b>&nbsp;&nbsp;" $codLine;
11              
$line++;
12         }
13         
$codigo implode"<br />"$buffer );
14         
// quit ASCII break lines 
15         
$codigo str_replace("\r",'',$codigo);
16         
$codigo str_replace("\n",'',$codigo);
17         
// HACK: 
18         
$codigo str_replace"<b style='color:#888!important;'>1</b>&nbsp;&nbsp;<code>""<code><b style='color:#888!important;'>1</b>&nbsp;&nbsp;"$codigo );
19         
// FRAME DECORATION:
20         
$codigo "<div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'>".$codigo."</div>";
21    }
22    
?>
23  
  <html>
24    <head>
25         <title>Format Code</title>
26    </head>
27    <body>
28    
29    <div style='width:600px;margin:5px auto;line-height:1.3em;'>
30    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
31            <h2>1. Source code</h2>
32         <textarea rows="7" cols="80" name="codigo"><?php 
33              
echo htmlentities(stripslashes($_POST['codigo'])); ?></textarea>
34         <br />
35         <input type="submit" name="send" value="Send &darr;" />
36    </form>
37            <h2>2. Formatted code</h2>
38         <textarea rows="7" cols="80"><?php 
39         
echo htmlentities($codigo); ?></textarea><br />
40            <h2>3. Preview</h2>
41                   <?php echo $codigo?>
42  
  </div>
43    
44    </body>
45    </html>

Podéis descargarlo aquí: highlightingcode.tar.gz

Inconveniente: solamente colorea la sintaxis de PHP. Para los otros lenguajes (HTML, CSS, javascript, etc...) al menos añade los números de línea y conserva la tabulación, lo cuál es una gran ayuda, no?

La verdad, a mí, ya me es más que suficiente. Sería ideal que también coloreara otros lenguajes. En este sentido existe una librería gratuita muy interesante, pero ya se hace bastante más complicado usarla: SyntaxHighlighter.