2010-04-17 18 views

Respuesta

25

Uso del Date object para hacer eso:

new Date(<?php echo time(); ?>*1000) 

es necesario multiplicar la marca de tiempo Unix en 1000 becuase Date espera que la marca de tiempo para estar en milisegundos.

Y para formatear la fecha, puede utilizar este Date.format method (Fecha no tiene ninguno incorporado).

+0

¡Ese método Date.format es de ensueño! Muchas gracias :) – Lyon

+1

En lugar de multiplicar, puede agregar 3 ceros: var now = new Date ( 000); –

2

Vas a querer ser realmente cuidadoso al hacer esto. Cuando toma un valor de tiempo del lado del servidor que es un valor tradicional de "número de segundos (o milisegundos) desde el límite de época", y luego lo convierte en algún tipo de objeto "Fecha", se produce una traducción en el huso horario apropiado para la configuración regional del contexto.

El problema surge cuando tienes un servidor ubicado en Chicago, y alguien en Hawaii usa tu sitio, por ejemplo después de una fiesta — uno de esos asuntos "luau", sin duda, completo con cerdo asado y faldones de hierba bailarinas, una noche rara bajo el cálido cielo tropical, flores exóticas que huelen las brisas del océano — y ya es tarde. ¡Dios mío, es casi medianoche! ¿Qué pensará mamá cuando le escriba sobre la fiesta?

Nuestro asistente a fiestas se sienta a las 11:30 PM para usar su sitio. Ahora, por supuesto, al estar considerablemente al este de Hawai, su servidor piensa que son las 5:30 a.m., y la fecha es un día más tarde que la fecha que nuestro asistente a la fiesta anotará en su nota rápida para mamá. Entonces su servidor escribe su valor de tiempo en una página web como se describe en las respuestas aquí, y — correctamente — la hora local de Hawái aparece en la página en la habitación de nuestro hotel de asistentes de fiesta.

El problema es el siguiente: si eso locales tiempo hace volver a la aplicación de algún campo de formulario, y su aplicación lo trata como hora local en Chicago, entonces su sitio conseguirá la fecha de ayer. Dependiendo de la aplicación que sea correcta o incorrecta, el punto es que debe hacer un seguimiento de donde una fecha (expresada en notación de calendario ordinaria) proviene de donde la fecha es utilizada.

Por supuesto, puede tener el problema opuesto. Es decir, si el servidor siempre muestra las fechas en su zona horaria local, los usuarios de otras partes del mundo verán valores de fecha y hora confusos (aparentemente incorrectos), por lo que la interfaz debe dejar en claro lo que significan esos valores. Los problemas se vuelven importantes cuando su sitio ofrece servicios relacionados con los horarios. Si es posible programar las operaciones, es importante que la interfaz mantenga las cosas en el nivel para que "30 de abril a las 10:00 p.m." signifique esa fecha y hora en el servidor o esa fecha y hora en la configuración regional desde la que se programó fue arreglado. Cualquiera que sea, debes tener cuidado de mantener las cosas consistentes.

2

En lugar de una marca de tiempo de unix numérico, también puede enviar una representación textual de la fecha que Date.parse() entiende.
Tal vez sea solo mi contribución al calentamiento global, pero creo que hay beneficios en el uso de un formato que es un poco más legible y contiene la información de la zona horaria.

p. Ej.

<?php 
// I have "decided" America/Los_Angeles fits most of my audience 
date_default_timezone_set('America/Los_Angeles'); 
$now = time(); 
$yesterday = strtotime('yesterday', $now); 
// March 27, 1976 08:00:00 tz:America/Los_Angeles 
$someotherdate = mktime(8, 0, 0, 3, 27, 1976) 
?><html> 
    <head><title>...</title> 
    <script type="text/javascript" src="jquery.min.js"></script> 
    <script type="text/javascript"> 
     function foo() { 
     $('.datetime').each(function() { 
      var t = $(this).text(); 
      t = new Date(Date.parse(t)).toLocaleString(); 
      $(this).text(t); 
     }); 
     } 
    </script> 
    </head> 
    <body> 
    <div><span class="datetime"><?php echo date(DateTime::RSS, $now); ?></span></div> 
    <div><span class="datetime"><?php echo date(DateTime::RSS, $yesterday); ?></span></div> 
    <div><span class="datetime"><?php echo date(DateTime::RSS, $someotherdate); ?></span></div> 
    <button onclick="foo()">to local time</button> 
    </body> 
</html> 

Esto imprime

Sat, 17 Apr 2010 04:40:15 -0700 
Fri, 16 Apr 2010 00:00:00 -0700 
Sat, 27 Mar 1976 08:00:00 -0800 

en mi navegador y (desde mi zona horaria local es Europe/Berlin, CET, GMT + 1/2) después de golpear el botón to local time

Samstag, 17. April 2010 13:40:15 
Freitag, 16. April 2010 09:00:00 
Samstag, 27. März 1976 17:00:00 
+0

Sí, pero mira mi respuesta. Si el servidor le entrega al Javascript un valor de tiempo que ha sido formateado como por hora local * en el servidor *, entonces el cliente verá el tiempo del lado del servidor. Eso puede ser deseado, o puede no serlo; depende de la aplicación y el significado del valor de tiempo. En cualquier caso, este enfoque arrojaría resultados diferentes que el enfoque de usar el valor de tiempo numérico directamente. – Pointy

+0

@Pointy: No estoy seguro si entiendo su preocupación en este caso. Por supuesto, el valor depende de que el reloj del servidor "piense" la hora, es decir, si el reloj del servidor está equivocado, el valor también será incorrecto. Pero utilicé 'gmdate()' y 'DateTime :: W3C' como el formato, es decir, la salida se ve como' 2010-04-17T11: 12: 22 + 00: 00' donde '+00: 00' marca la zona horaria (al menos el desplazamiento). Date.parse() reconoce el desplazamiento y trata el valor en consecuencia. – VolkerK

+0

Bien, en ese caso definitivamente tendría el mismo efecto que usar el valor de tiempo "en bruto" (el "número de segundos" numérico), así que lamento no haberlo visto. – Pointy

0

Ahora es 2013, y a medida que más y más personas cambian el procesamiento de los resultados de SQL en PHP para pasar los resultados en JSON y el procesamiento en el lado del cliente, creo que moment.js merece algo de atención por sí mismo para ofrecer un fácil reemplazo cementa las funciones de strtotime() y date() de PHP en Javascript, más algunas más.

Sólo incluyen:

<script src="SCRIPT_DIR/moment.min.js" type="text/javascript"></script> 

Entonces es tan fácil como:

// Simulates ajax response 
var data = { someDate: "2023-08-23 11:52:39" } 

// .unix() converts to Unix timestamp: 1692816759 
moment(data.someDate).unix(); 

// Displaying it in a readable format 
// Aug 23, 11:52 AM 
moment("2023-08-23 11:52:39").format('MMM D, hh:mm A'); 

// Now 
moment(); 

// Support for manipulation and chaining 
moment().add('days', 7).subtract('months', 1).hours(15).minutes(0).seconds(0); 

, usted puede obtener el archivo de 5,5 kb js aquí:

http://momentjs.com/

Más documentos aquí:

http://momentjs.com/docs/

Cuestiones relacionadas