Um programa excelente deve levar em consideração I18n e L10N, mas Javascript é muito hostil no processamento de datas. O problema se reflete nos seguintes aspectos:
Embora Js também defina uma função de horário UTC, o fuso horário quando o script está sendo executado é obtido automaticamente. do sistema e não pode ser alterado. Em aplicações práticas, muitas vezes é necessário aceitar dados de hora que não estejam no fuso horário atual do sistema para conversão. Neste momento, a inteligência de Js traz muitos problemas.
A análise automática e a saída formatada de datas do JS têm desempenho diferente dependendo do ambiente do sistema e do navegador. Isso se reflete principalmente nos métodos Date.parse e toLocaleString.
Para melhorar as capacidades de processamento de data de Js da maneira mais fácil possível, apenas duas extensões são feitas no objeto Date de Js
/**
* Obtenha o carimbo de data/hora UTC da hora atual
* @return {int} carimbo de data/hora unix
*/
Date.prototype.getTimeUTC = function() {
retornar this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* Altere a hora da operação atual para o fuso horário (usado principalmente para converter a hora em outro fuso horário)
*
* @param {int} tzo fuso horário original-12~13
* @param {int} tzo target time zone-12~13 o padrão é o fuso horário atual
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
/**
* Obtenha o carimbo de data/hora UTC da hora atual
* @return {int} carimbo de data/hora unix
*/
Date.prototype.getTimeUTC = function() {
retornar this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* Altere a hora da operação atual para o fuso horário (usado principalmente para converter a hora em outro fuso horário)
*
* @param {int} tzo fuso horário original-12~13
* @param {int} tzo target time zone-12~13 o padrão é o fuso horário atual
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
Neste ponto, um novo desenvolvimento pode ser realizado com base neste objeto Js Date estendido.
A ideia é muito simples, ou seja, primeiro transferir a hora em qualquer formato e fuso horário para o mesmo fuso horário do sistema atual através do método changeTimezone, e depois operar no timestamp UTC Unix gerado por getTimeUTC.
Por exemplo, quero calcular a diferença horária entre 4 de junho de 2008, 16h30 no fuso horário +8 e a hora atual no fuso horário +9
// analisá-lo automaticamente em um carimbo de data / hora unix
var p = Date.parse('4 de junho de 2008, 16h30');
var time_parse = nova data(p);
//Converte para o fuso horário a ser comparado
time_parse.changeTimezone(8,9);
var time_now = new Data();
//Converte para UTC para comparação
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('diferença' + parseInt(der / 1000/60) + 'minutos');
//Análise automaticamente em timestamp unix
var p = Date.parse('4 de junho de 2008, 16:30');
var
time_parse = new Date(p);
time_parse.changeTimezone(8,9);
var
time_now = new Date();
var der = time_now.getTimeUTC() - time_parse.getTimeUTC()
alert('diferença' + parseInt(der / 1000/60) + 'minutos');
É claro que existem códigos mais simples, mas é menos sujeito a erros para esclarecer ideias em aplicações complexas.
Se você deseja implementar um lembrete mais fácil de usar, como XX dias XX meses atrás, na coluna esquerda deste blog, você pode expandi-lo aqui de acordo com suas necessidades. As funções implementadas são as seguintes
/**
* representa a diferença entre o horário especificado e agora
*
* @param {int} t O horário a ser comparado carimbo de data/hora unix (UTC)
* @param {int} n como o horário padrão, o padrão é o horário atual unix timestamp (UTC)
* @return {string} expressão da diferença horária
*/
Data.prototype.derTime = função (t,n) {
var n = n ? n : this.getTimeUTC();
função ms2min(ms) {
retornar parseInt(ms/1000/60);
}
var der = ms2min(n - t);
var ba = der > 0 ? antes' : 'depois';
der = Math.abs(der);
varres='';
if(der == 0) {
res = 'apenas';
}
senão if(0 < der && der < 60) {
res = der + 'minuto' + ba;
}
senão if(60 <= der && der < 24 * 60) {
var min = der % 60 == 0 ? '' : String(der % 60) + 'minutos';
res = String(parseInt(der / 60)) + 'hora' + min + ba;
}
senão if(der >= 24 * 60 && der < 24 * 60 * 31) {
res = String(parseInt(der / 60/24)) + 'dia' + ba;
}
senão if(der >= 24 * 60 * 31 && der < 24* 60 * 365) {
res = String(parseInt(der/60/24/31)) + 'mês' + ba;
}
senão if(der > 24 * 60 * 365) {
res = String(parseInt(der/60/24/365)) + 'ano' + ba;
}
retornar res;
}
/**
* Analise a diferença entre um campo de hora e a hora atual
* @param {string} eu
* @param {int} fuso horário-12~13
*/
função time_der(i,tz) {
var p = Data.parse(i);
se(!p){
retornar eu;
}
var time_parse = nova data(p);
if(tz != indefinido) {
time_parse.changeTimezone(tz);
}
var time_now = new Data();
retornar time_now.derTime(time_parse.getTimeUTC());