Un excellent programme doit prendre en compte à la fois I18n et L10N, mais Javascript est très peu convivial dans le traitement des dates. Le problème se reflète dans les aspects suivants :
Bien que Js définisse également une fonction d'heure UTC, le fuseau horaire lorsque le script est en cours d'exécution est automatiquement obtenu. du système et ne peut pas être modifié. Dans les applications pratiques, il est souvent nécessaire d'accepter des données temporelles qui ne se trouvent pas dans le fuseau horaire actuel du système pour la conversion. À l'heure actuelle, l'intelligence de Js pose beaucoup de problèmes.
L'analyse automatique et la sortie formatée des dates par JS fonctionnent différemment selon l'environnement système et l'environnement du navigateur. Cela se reflète principalement dans les méthodes Date.parse et toLocaleString. Les étudiants intéressés peuvent le tester par eux-mêmes.
Afin d'améliorer au maximum les capacités de traitement de Date de Js, seules deux extensions sont apportées à l'objet Date de Js
/**
* Obtenez l'horodatage UTC de l'heure actuelle
* @return {int} horodatage unix
*/
Date.prototype.getTimeUTC = fonction() {
renvoie this.getTime() + this.getTimezoneOffset() * 60 * 1000 ;
}
/**
* Changer l'heure de l'opération en cours selon le fuseau horaire (principalement utilisé pour convertir l'heure dans un autre fuseau horaire)
*
* @param {int} tzo fuseau horaire d'origine-12~13
* @param {int} tzo target time zone-12~13 est par défaut le fuseau horaire actuel
*/
Date.prototype.changeTimezone = fonction (tzo,tzn) {
tzo = tzo * 60 ;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
/**
* Obtenez l'horodatage UTC de l'heure actuelle
* @return {int} horodatage unix
*/
Date.prototype.getTimeUTC = fonction() {
renvoie this.getTime() + this.getTimezoneOffset() * 60 * 1000 ;
}
/**
* Changer l'heure de l'opération en cours selon le fuseau horaire (principalement utilisé pour convertir l'heure dans un autre fuseau horaire)
*
* @param {int} tzo fuseau horaire d'origine-12~13
* @param {int} tzo target time zone-12~13 est par défaut le fuseau horaire actuel
*/
Date.prototype.changeTimezone = fonction (tzo,tzn) {
tzo = tzo * 60 ;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
À ce stade, un nouveau développement peut être effectué sur la base de cet objet Js Date étendu.
L'idée est très simple, c'est-à-dire qu'il faut d'abord transférer l'heure dans n'importe quel format et fuseau horaire vers le même fuseau horaire que le système actuel via la méthode changeTimezone, puis opérer sur l'horodatage UTC Unix généré par getTimeUTC.
Par exemple, je souhaite calculer le décalage horaire entre le 4 juin 2008, 16h30 dans le fuseau horaire +8 et l'heure actuelle dans le fuseau horaire +9
// l'analyse automatiquement dans un horodatage Unix.
var p = Date.parse('4 juin 2008, 16:30');
var time_parse = nouvelle Date(p);
//Convertir vers le fuseau horaire à comparer
time_parse.changeTimezone(8,9);
var time_now = nouvelle Date();
//Convertir en UTC pour comparaison
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('différence' + parseInt(der / 1000 / 60) + 'minutes');
//Analyser automatiquement dans l'horodatage Unix
var p = Date.parse('4 juin 2008, 16:30');
var time_parse = new Date(p);
//Convertir vers le fuseau horaire à comparer
time_parse.changeTimezone(8,9);
var time_now = new Date();
//Convertir en UTC pour comparaison
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alert('difference' + parseInt(der / 1000 / 60) + 'minutes');
Bien sûr, il existe des codes plus simples, mais il est moins sujet aux erreurs de clarifier des idées dans des applications complexes.
Si vous souhaitez implémenter un rappel plus convivial comme il y a XX jours XX mois dans la colonne de gauche de ce blog, vous pouvez le développer davantage ici en fonction de vos besoins. Les fonctions implémentées sont les suivantes
/**
* représente la différence entre l'heure spécifiée et maintenant
*
* @param {int} t L'heure à comparer, horodatage Unix (UTC)
* @param {int} n comme heure standard, par défaut l'heure actuelle, horodatage Unix (UTC)
* @return {string} expression de la différence de temps
*/
Date.prototype.derTime = fonction(t,n) {
var n = n ? n : this.getTimeUTC();
fonction ms2min(ms) {
return parseInt(ms/1000/60);
}
var der = ms2min(n - t);
var ba = der > 0 ? 'avant' : 'après';
der = Math.abs(der);
var res = '';
si(der == 0) {
res = 'juste';
}
sinon if(0 < der && der < 60) {
res = der + 'minute' + ba;
}
sinon if(60 <= der && der < 24 * 60) {
var min = der % 60 == 0 ? '' : String(der % 60) + 'minutes';
res = String(parseInt(der / 60)) + 'heure' + min + ba;
}
sinon if(der >= 24 * 60 && der < 24 * 60 * 31) {
res = String(parseInt(der / 60 / 24)) + 'jour' + ba;
}
sinon if(der >= 24 * 60 * 31 && der < 24* 60 * 365) {
res = String(parseInt(der / 60/24/31)) + 'mois' + ba;
}
sinon si(der > 24 * 60 * 365) {
res = String(parseInt(der / 60/24/365)) + 'année' + ba;
}
retourner la résolution ;
}
/**
* Analyser la différence entre un champ horaire et l'heure actuelle
* @param {chaîne} je
* @param {int} fuseau horaire-12~13
*/
fonction time_der(i,tz) {
var p = Date.parse(i);
si(!p) {
je reviens;
}
var time_parse = nouvelle Date(p);
si(tz != non défini) {
time_parse.changeTimezone(tz);
}
var time_now = nouvelle Date();
return time_now.derTime(time_parse.getTimeUTC());