Ein ausgezeichnetes Programm muss sowohl I18n als auch L10N berücksichtigen, aber Javascript ist bei der Datumsverarbeitung sehr unfreundlich. Das Problem spiegelt sich in den folgenden Aspekten wider:
Obwohl Js auch eine UTC-Zeitfunktion festlegt, wird die Zeitzone automatisch ermittelt, wenn das Skript ausgeführt wird aus dem System entfernt und kann nicht geändert werden. In praktischen Anwendungen ist es häufig erforderlich, Zeitdaten zur Konvertierung zu akzeptieren, die nicht in der aktuellen Systemzeitzone liegen. Zu diesem Zeitpunkt bringt die Cleverness von Js große Probleme mit sich.
Das automatische Parsen und die formatierte Ausgabe von Datumsangaben in JS sind je nach Systemumgebung und Browserumgebung unterschiedlich. Dies spiegelt sich hauptsächlich in den Methoden Date.parse und toLocaleString wider.
Um die Datumsverarbeitungsfunktionen von Js so einfach wie möglich zu verbessern, werden nur zwei Erweiterungen am Datumsobjekt von Js vorgenommen
/**
* Holen Sie sich den UTC-Zeitstempel der aktuellen Zeit
* @return {int} Unix-Zeitstempel
*/
Date.prototype.getTimeUTC = function() {
return this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* Ändern Sie die Zeit des aktuellen Vorgangs in die Zeitzone (wird hauptsächlich zum Umrechnen der Zeit in eine andere Zeitzone verwendet).
*
* @param {int} tzo ursprüngliche Zeitzone-12~13
* @param {int} tzo target time zone-12~13 ist standardmäßig die aktuelle Zeitzone
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
/**
* Holen Sie sich den UTC-Zeitstempel der aktuellen Zeit
* @return {int} Unix-Zeitstempel
*/
Date.prototype.getTimeUTC = function() {
return this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* Ändern Sie die Zeit des aktuellen Vorgangs in die Zeitzone (wird hauptsächlich zum Umrechnen der Zeit in eine andere Zeitzone verwendet).
*
* @param {int} tzo ursprüngliche Zeitzone-12~13
* @param {int} tzo target time zone-12~13 ist standardmäßig die aktuelle Zeitzone
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
tzo = tzo * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
An diesem Punkt kann eine neue Entwicklung basierend auf diesem erweiterten Js Date-Objekt durchgeführt werden.
Die Idee ist sehr einfach: Übertragen Sie zunächst die Zeit in einem beliebigen Format und einer beliebigen Zeitzone über die Methode changeTimezone in dieselbe Zeitzone wie das aktuelle System und verarbeiten Sie sie dann mit dem von getTimeUTC generierten UTC-Unix-Zeitstempel.
Ich möchte zum Beispiel den Zeitunterschied zwischen dem 4. Juni 2008, 16:30 Uhr in der Zeitzone +8 und der aktuellen Zeit in der Zeitzone +9 berechnen
// und ihn automatisch in einen Unix-Zeitstempel analysieren
var p = Date.parse('4. Juni 2008, 16:30');
var time_parse = neues Datum(p);
//In die zu vergleichende Zeitzone konvertieren
time_parse.changeTimezone(8,9);
var time_now = new Date();
//Zum Vergleich in UTC konvertieren
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alarm('difference' + parseInt(der / 1000 / 60) + 'minutes');
//Automatisch in den Unix-Zeitstempel analysieren
var p = Date.parse('4 Jun 2008, 16:30');
var time_parse = new Date(p);
//In die zu vergleichende Zeitzone konvertieren
time_parse.changeTimezone(8,9);
var time_now = new Date();
//Zum Vergleich in UTC konvertieren
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
alarm('difference' + parseInt(der / 1000 / 60) + 'minutes');
Natürlich gibt es einfachere Codes, aber es ist weniger fehleranfällig, Ideen in komplexen Anwendungen zu verdeutlichen.
Wenn Sie eine benutzerfreundlichere Erinnerung wie vor XX Tagen und XX Monaten in der linken Spalte dieses Blogs implementieren möchten, können Sie diese hier entsprechend Ihren Anforderungen weiter ausbauen. Die implementierten Funktionen sind wie folgt
/**
* stellt die Differenz zwischen der angegebenen Zeit und jetzt dar
*
* @param {int} t Der zu vergleichende Unix-Zeitstempel (UTC)
* @param {int} n als Standardzeit, standardmäßig der aktuelle Unix-Zeitstempel (UTC)
* @return {string} Ausdruck der Differenzzeit
*/
Date.prototype.derTime = function(t,n) {
var n = n ? n : this.getTimeUTC();
Funktion ms2min(ms) {
return parseInt(ms / 1000 / 60);
}
var der = ms2min(n - t);
var ba = der > 0 ? 'vorher' : 'nachher';
der = Math.abs(der);
var res = '';
if(der == 0) {
res = 'nur';
}
sonst if(0 < der && der < 60) {
res = der + 'Minute' + ba;
}
sonst if(60 <= der && der < 24 * 60) {
var min = der % 60 == 0 ? '' : String(der % 60) + 'Minuten';
res = String(parseInt(der / 60)) + 'hour' + min + ba;
}
else if(der >= 24 * 60 && der < 24 * 60 * 31) {
res = String(parseInt(der / 60 / 24)) + 'day' + ba;
}
else if(der >= 24 * 60 * 31 && der < 24* 60 * 365) {
res = String(parseInt(der / 60 / 24 / 31)) + 'Monat' + ba;
}
sonst if(der > 24 * 60 * 365) {
res = String(parseInt(der / 60 / 24 / 365)) + 'year' + ba;
}
res zurückgeben;
}
/**
* Analysieren Sie die Differenz zwischen einem Zeitfeld und der aktuellen Zeit
* @param {string} i
* @param {int} Zeitzone-12~13
*/
Funktion time_der(i,tz) {
var p = Date.parse(i);
if(!p) {
gib i zurück;
}
var time_parse = neues Datum(p);
if(tz != undefiniert) {
time_parse.changeTimezone(tz);
}
var time_now = new Date();
return time_now.derTime(time_parse.getTimeUTC());