2010-04-10 13 views
10

Soy desarrollador de Java y estoy acostumbrado a la clase SimpleDateFormat que me permite formatear cualquier fecha en cualquier formato mediante la configuración de una zona horaria.Javascript DateFormat para diferentes zonas horarias

Date date = new Date(); 

SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss"); 

sdf.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles")); 
System.out.println(sdf.format(date)); // Prints date in Los Angeles 

sdf.setTimeZone(TimeZone.getTimeZone("America/Chicago")); 
System.out.println(sdf.format(date)); // Prints same date in Chicago 

SimpleDateFormat es una solución muy buena en Java, pero desafortunadamente no puedo encontrar ninguna alternativa similar en Javascript.

Estoy extendiendo el prototipo de fecha en Javascript para hacer exactamente lo mismo. Tengo fechas en formato Unix, pero quiero formatearlas en diferentes zonas horarias.

Date.prototype.format = function(format, timezone) { 
    // Now what? 
    return formattedDate; 
} 

Estoy buscando una forma ordenada de hacer esto en lugar de un truco.

Gracias

+0

No hay manera fácil de hacer esto. JavaScript tiene poco o ningún soporte para zonas horarias. En una aplicación de calendario que había construido, que tenía más de unas pocas páginas de código para manejar fechas y zonas horarias, incluyendo un archivo XML grande que tuvo que ser descargado desde el servidor que contenía las ciudades y sus zonas correspondientes - y su horario de verano reglas. – mwilcox

+0

Digamos que proporciono el Offset bruto GMT, ¿eso lo haría más fácil? – Elie

Respuesta

3

JavaScript no tiene compatibilidad para otra zona horaria que la local. Solo puede expresar una fecha en la hora local o en hora UTC. No hay forma de cambiar la compensación de zona horaria de un objeto Date.

Por lo tanto, no hay una manera "ordenada" de resolver su problema.

+0

Los comentarios en la página TechRepublic ha vinculado para indicar que la solución (y la escritura) ofrecieron hay muy mala e incorrecta ... – blong

1

No escriba sus propias cosas; Acaba de obtener Datejs: http://www.datejs.com/

Puede averiguar cuál es el desplazamiento de zona horaria se establece en el entorno de ejecución de la siguiente manera:

var local = new Date(); 
var utc = Date.UTC(local.getFullYear(), local.getMonth(), local.getDate(), local.getHours(), local.getMinutes(), local.getSeconds(), local.getMilliseconds()); 
var tz = (utc - local.getTime())/(60 * 60 * 1000); 
+1

El objetivo es manejar zonas horarias, DateJS no parece hacerlo. – Elie

+1

Versión alfa en 2007 y sin actividad desde entonces. – nilskp

1

Si estás de paso del TZ cruda no hay nada realmente complicado sobre el ajuste de la horas Mi ejemplo a continuación está, por supuesto, abreviado. La tuya puede ser bastante larga dependiendo de cuántos patrones manejarías.

Date.prototype.format = function(format, tzAdjust) { 
    // adjust timezone 
    this.setHours(this.getHours()+tzAdjust) 
    // pad zero helper - return "09" or "12" 
    var two = function(s){ return s+"".length==1 ? "0"+s : s+""; } 
    // replace patterns with date numbers 
    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){ 
     switch(pattern){ 
      case "d" : return this.getDate(); 
      case "dd" : return two(this.getDate()); 
     } 
    }); 
} 
+1

Esta no es una solución muy limpia. Porque digamos que quieres formatear la misma fecha dos veces, se ajustará dos veces. Por otro lado, getHours devuelve la hora en la zona horaria del usuario, la suma del desplazamiento prima no es suficiente, es necesario tener en cuenta la zona horaria del usuario, así (getTimezoneOffset()). De todas formas, mediante el uso de setHours, podrás cambiar la fecha, que es una manera incorrecta de manejar fechas. – Elie

1

Intentando (muy ligeramente) mejorar la sugerencia de mwilcox:

Date.prototype.format = function(format, tzAdjust) { 

    // get/setup a per-date-instance tzDate object store 
    var tzCache = this.__tzCache = this.__tzCache || (this.__tzCache = {}); 

    // fetch pre-defined date from cache 
    var tzDate = tzCache[tzAdjust]; 
    if (!tzDate) 
    { 
     // on miss - then create a new tzDate and cache it 
     tzDate = tzCache[tzAdjust] = new Date(this); 
     // adjust by tzAdjust (assuming it's in minutes 
     // to handle those weird half-hour TZs :) 
     tzDate.setUTCMinutes(tzDate.getUTCMinutes()+tzAdjust); 
    } 

    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){ 
       // replace each format tokens with a value 
       // based on tzDate's corresponding UTC property 
      }); 
} 
1

Usted está pidiendo claramente dos preguntas en una, el formato y la zona horaria. Deben abordarse por separado. El formateo es bastante trivial; si ninguna de las otras respuestas sirve para eso, tendrá que ser más específico.

En cuanto a la hora y la zona horaria, si su servidor inyecta la hora UTC, preferiblemente como tiempo UNIX en milisegundos, en JavaScript, puede comparar eso con la hora en la máquina cliente, y así averiguar cómo lejos de UTC, el cliente sí. Luego puede calcular la hora de cualquier zona horaria que desee.

Editar: En realidad, no sabía que JavaScript también había construido en tiempo UTC hasta que lo revisé en Internet, limpio.

En cualquier caso, supongo que esto es lo que desea:

Date.prototype.format=function(format,timezone){ 
    var obj=new Date(this.getTime()+this.getTimezoneOffset()*60000+timezone*3600000); 
    var two=function(s){ 
     return s<10?"0"+s:s+""; 
    } 
    return format.replace(/dd|MM|yyyy|hh|mm|ss/g, function(pattern){ 
     switch(pattern){ 
      case "dd" : return two(obj.getDate()); 
      case "MM" : return two(obj.getMonth()+1); 
      case "yyyy" : return obj.getFullYear(); 
      case "hh" : return two(obj.getHours()); 
      case "mm" : return two(obj.getMinutes()); 
      case "ss" : return two(obj.getSeconds()); 
     } 
    }); 
} 

Puede añadir más patrones en si es necesario.

+0

eBusiness, no estoy haciendo dos preguntas en una. En muchos lenguajes de programación, el objeto Date no cambia con la zona horaria, es la forma en que se muestra que cambia. La fecha NOW es la misma en todo el mundo, pero se muestra de manera diferente. Si nos fijamos en mi ejemplo de Java, notar cómo estoy mostrando el mismo objeto Date utilizando dos diferentes formatos de fecha. – Elie

2

El formato extendido de ISO para la fecha común es AAAA-MM-DD, y para el tiempo es hh: mm: ss. Cualquiera de los formatos puede ser entendido, inequívocamente, en todo el mundo.

Consulte también: http://jibbering.com/faq/#dates

+2

No sin una zona horaria. – nilskp

0

Esta es una vieja pregunta, pero desde que encontré:

Como se ha mencionado, no hay nada razonable incorporado.

En cuanto a libs, hay Moment Timezone para Moment.js.

Aquí es una jsFiddle con un ejemplo: http://jsfiddle.net/kunycrkb/

El código misma línea:

var m = moment("2014-06-01T13:05:00Z"); 
var f = "HH:mm z"; 

$("#results").text(m.tz("UTC").format(f) + " is " + m.tz("EST").format(f) + "!"); 
Cuestiones relacionadas