javascript - new - moment js
Muestra la fecha/hora en el formato de configuraciĆ³n regional del usuario y la compensaciĆ³n de tiempo (13)
Quiero que el servidor siempre sirva fechas en UTC en el HTML, y que JavaScript en el sitio del cliente lo convierta a la zona horaria local del usuario.
Bonificación si puedo generar en formato de fecha de configuración regional del usuario.
Para nuevos proyectos, solo use moment.js
Esta pregunta es bastante antigua, por lo que moment.js no existía en ese momento, pero para proyectos nuevos, simplifica muchas tareas como esta.
Lo mejor es parse la cadena de fecha de UTC de la siguiente manera (cree una cadena compatible con ISO-8601 en el servidor para obtener resultados uniformes en todos los navegadores):
var m = moment("2013-02-08T09:30:26Z");
Ahora solo use m
en su aplicación, moment.js se establece de manera predeterminada en la zona horaria local para las operaciones de visualización. Hay muchas formas de formatear los valores de fecha y hora o extraer porciones de ellos.
Incluso puede formatear un objeto de momento en la configuración regional de los usuarios de esta manera:
m.format(''LLL'') // Returns "February 8 2013 8:30 AM" on en-us
Para transformar un objeto moment.js en una zona horaria diferente (es decir, ni la local ni la UTC), necesitará la extensión time.js timezone . Esa página también tiene algunos ejemplos, es bastante simple de usar.
Con la fecha del código PHP utilicé algo así ...
function getLocalDate(php_date) {
var dt = new Date(php_date);
var minutes = dt.getTimezoneOffset();
dt = new Date(dt.getTime() + minutes*60000);
return dt;
}
Podemos llamarlo así
var localdateObj = getLocalDate(''2015-09-25T02:57:46'');
El método .getTimezoneOffset()
informa el desplazamiento de la zona horaria en minutos, contando "hacia el oeste" desde la zona horaria GMT / UTC, lo que da como resultado un valor de compensación que es negativo al que estamos acostumbrados. (Ejemplo, el tiempo en Nueva York sería de +240 minutos o +4 horas)
Para obtener un desplazamiento de zona horaria normal en horas, debe usar:
var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60
Detalle importante:
Tenga en cuenta que el tiempo de ahorro de luz se tiene en cuenta en el resultado, por lo que lo que este método le ofrece es realmente el desplazamiento en el tiempo , no el desfase geográfico real de la zona horaria .
En JS no hay formas simples y multiplataforma de formatear el tiempo de fecha local, aparte de convertir cada propiedad como se mencionó anteriormente.
Aquí hay un truco rápido que uso para obtener el YYYY-MM-DD local. Tenga en cuenta que esto es un truco, ya que la fecha final ya no tendrá la zona horaria correcta (por lo tanto, debe ignorar la zona horaria). Si necesito algo más, uso moment.js.
var d = new Date();
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0);
// 2017-05-09T08:24:26.581Z (but this is not UTC)
El d.getTimezoneOffset () devuelve el desplazamiento de zona horaria en minutos, y el d.getTime () está en ms, de ahí el x 60,000.
Esto es lo que he usado en proyectos anteriores:
var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant(''<%=DataCurrentDate%>'', ''yyyyMMdd hh:mm:ss'');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set. again, I''m using MS Ajax''s $get
var dateSpn = $get(''dataDate'');
dateSpn.innerHTML = myDate.localeFormat(''F'');
La mejor solución que he encontrado es crear [time display = "llll" datetime = "UTC TIME" /] Tags, y usar javascript (jquery) para analizar y mostrarlo en relación con la hora del usuario.
moment.js Moment.js
mostrará el tiempo muy bien.
Mezclé las respuestas hasta el momento y las agregué, porque tuve que leerlas todas e investigar por un tiempo para mostrar una cadena de fecha y hora desde db en el formato de zona horaria local de un usuario.
La cadena datetime proviene de un db python / django en el formato: 2016-12-05T15: 12: 24.215Z
La detección confiable del idioma del navegador en JavaScript no parece funcionar en todos los navegadores (consulte JavaScript para detectar la preferencia de idioma del navegador ), así que obtengo el idioma del navegador del servidor.
Python / Django: envía el idioma del navegador de solicitudes como parámetro de contexto:
language = request.META.get(''HTTP_ACCEPT_LANGUAGE'')
return render(request, ''cssexy/index.html'', { "language": language })
HTML: escríbalo en una entrada oculta:
<input type="hidden" id="browserlanguage" value={{ language }}/>
JavaScript: obtenga valor de la entrada oculta, por ejemplo, en-GB, en-US; q = 0.8, en; q = 0.6 / y luego tome el primer idioma de la lista solo mediante replace y la expresión regular
const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(/w{2}/-/w{2}),.*/, "$1");
JavaScript: conviértalo a datetime y formatéelo:
var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);
El resultado es (el idioma del navegador es en-gb): 12/05/2016, 14:58
No sé cómo hacer locale, pero javascript es una tecnología del lado del cliente.
usersLocalTime = new Date();
tendrá la fecha y hora del cliente (según lo informado por su navegador, y por extensión, la computadora en la que están sentados). Sería trivial incluir el tiempo del servidor en la respuesta y hacer algunos cálculos matemáticos simples para estimar la compensación.
Puede usar new Date().getTimezoneOffset()/60
para la zona horaria. También hay un método toLocaleString()
para mostrar una fecha usando la configuración regional del usuario.
Aquí está toda la lista: Trabajar con fechas
Puede usar lo siguiente, que informa el desplazamiento de la zona horaria desde GMT en minutos:
new Date().getTimezoneOffset();
Nota: - esta función devuelve un número negativo.
Una vez que haya construido su objeto de fecha, aquí hay un fragmento para la conversión:
La función toma un objeto de fecha con formato UTC y una cadena de formato.
Necesitará un prototipo Date.strftime
.
function UTCToLocalTimeString(d, format) {
if (timeOffsetInHours == null) {
timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
}
d.setHours(d.getHours() + timeOffsetInHours);
return d.strftime(format);
}
getTimeZoneOffset () y toLocaleString son buenos para el trabajo básico de fecha, pero si necesita soporte de zona horaria real, mire TimeZone.js de mde .
Hay algunas opciones más discutidas en la respuesta a esta pregunta
Parece que la forma más infalible para comenzar con una fecha UTC es crear un nuevo objeto Date
y usar los métodos setUTC…
para establecerlo en la fecha / hora que desee.
Luego, los diversos métodos toLocale…String
proporcionarán resultados localizados.
Ejemplo:
// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);
console.log(d); // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString()); // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString()); // -> 02/28/2004
console.log(d.toLocaleTimeString()); // -> 23:45:26