Un programa excelente debe tener en cuenta tanto I18n como L10N, pero Javascript es muy hostil en el procesamiento de fechas. El problema se refleja en los siguientes aspectos:
aunque Js también establece una función de hora UTC, la zona horaria cuando se ejecuta el script se obtiene automáticamente. del sistema y no se puede cambiar. En aplicaciones prácticas, a menudo es necesario aceptar datos de hora que no se encuentran en la zona horaria actual del sistema para la conversión. En este momento, la astucia de Js trae muchos problemas.
El análisis automático y la salida formateada de fechas de JS funcionan de manera diferente según el entorno del sistema y el entorno del navegador. Esto se refleja principalmente en los métodos Date.parse y toLocaleString.
Para mejorar las capacidades de procesamiento de Fecha de Js lo más fácilmente posible, solo se realizan dos extensiones al objeto Fecha de Js
/**
* Obtener la marca de tiempo UTC de la hora actual
* @return {int} marca de tiempo unix
*/
Fecha.prototipo.getTimeUTC = función() {
devolver this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* Cambiar la hora de la operación actual a la zona horaria (se utiliza principalmente para convertir la hora en otra zona horaria)
*
* @param {int} tzo zona horaria original-12~13
* @param {int} tzo zona horaria objetivo-12~13 por defecto es la zona horaria actual
*/
Fecha.prototype.changeTimezone = función(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
/**
* Obtener la marca de tiempo UTC de la hora actual
* @return {int} marca de tiempo unix
*/
Fecha.prototipo.getTimeUTC = función() {
devolver this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* Cambiar la hora de la operación actual a la zona horaria (se utiliza principalmente para convertir la hora en otra zona horaria)
*
* @param {int} tzo zona horaria original-12~13
* @param {int} tzo zona horaria objetivo-12~13 por defecto es la zona horaria actual
*/
Fecha.prototype.changeTimezone = función(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
En este punto, se puede realizar un nuevo desarrollo basado en este objeto Js Date extendido.
La idea es muy simple, es decir, primero transfiera la hora en cualquier formato y zona horaria a la misma zona horaria que el sistema actual mediante el método changeTimezone, y luego opere con la marca de tiempo UTC Unix generada por getTimeUTC.
Por ejemplo, quiero calcular la diferencia horaria entre el 4 de junio de 2008, 16:30 en la zona horaria +8 y la hora actual en la zona horaria +9
// analizarla automáticamente en una marca de tiempo Unix
var p = Date.parse('4 de junio de 2008, 16:30');
var time_parse = nueva fecha(p);
//Convierte a la zona horaria a comparar
time_parse.changeTimezone(8,9);
var time_now = nueva fecha();
//Convertir a UTC para comparar
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('diferencia' + parseInt(der / 1000/60) + 'minutos');
//Analizar automáticamente en la marca de tiempo de Unix
var p = Date.parse('4 de junio de 2008, 16:30');
var time_parse = new Date(p);
//Convertir a la zona horaria a comparar.
time_parse.changeTimezone(8,9);
var time_now = new Date()
//Convertir a UTC para comparar.
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('diferencia' + parseInt(der / 1000/60) + 'minutos');
Por supuesto, hay códigos más simples, pero es menos propenso a errores para aclarar ideas en aplicaciones complejas.
Si desea implementar un recordatorio más fácil de usar, como hace XX días, XX meses en la columna izquierda de este blog, puede ampliarlo aún más aquí según sus necesidades. Las funciones implementadas son las siguientes
/**
* representa la diferencia entre la hora especificada y ahora
*
* @param {int} t La hora a comparar con la marca de tiempo Unix (UTC)
* @param {int} n como hora estándar, por defecto es la marca de tiempo Unix (UTC) de la hora actual
* @return {string} expresión de la diferencia horaria
*/
Fecha.prototipo.derTime = función(t,n) {
var n = n ? n : this.getTimeUTC();
función ms2min(ms) {
devolver parseInt(ms/1000/60);
}
var der = ms2min(n - t);
var ba = der > 0 ? 'antes' : 'después';
der = Math.abs(der);
varres='';
si(der == 0) {
res = 'solo';
}
else if(0 < de && de < 60) {
res = der + 'minuto' + ba;
}
else if(60 <= de && de < 24 * 60) {
var min = der % 60 == 0 ? '' : Cadena(der % 60) + 'minutos';
res = String(parseInt(der / 60)) + 'hora' + min + ba;
}
else if(der >= 24 * 60 && der < 24 * 60 * 31) {
res = String(parseInt(der / 60 / 24)) + 'día' + ba;
}
else if(der >= 24 * 60 * 31 && der < 24* 60 * 365) {
res = String(parseInt(der / 60 / 24 / 31)) + 'mes' + ba;
}
de lo contrario si(der > 24 * 60 * 365) {
res = String(parseInt(der / 60 / 24 / 365)) + 'año' + ba;
}
devolver resolución;
}
/**
* Analizar la diferencia entre un campo de hora y la hora actual
* @param {cadena} yo
* @param {int} zona horaria-12~13
*/
función time_der(i,tz) {
var p = Fecha.parse(i);
si(!p) {
devolver yo;
}
var time_parse = nueva fecha(p);
si(tz!= indefinido) {
time_parse.changeTimezone(tz);
}
var time_now = nueva fecha();
devolver time_now.derTime(time_parse.getTimeUTC());