훌륭한 프로그램은 I18n과 L10N을 모두 고려해야 하지만 Javascript는 날짜 처리에 매우 불친절합니다. 이 문제는 다음과 같은 측면에서 반영됩니다.
Js에서도 UTC 시간 함수를 설정하지만 스크립트가 실행되는 시점의 시간대를 자동으로 가져옵니다. 시스템에서 삭제되며 변경할 수 없습니다. 실제 응용에서는 변환을 위해 현재 시스템 시간대에 속하지 않는 시간 데이터를 허용해야 하는 경우가 많습니다. 이때 Js의 영리함은 많은 문제를 가져옵니다.
JS의 자동 구문 분석 및 날짜 형식 출력은 시스템 환경 및 브라우저 환경에 따라 다르게 수행됩니다. 이는 주로 Date.parse 및 toLocaleString 메소드에 반영됩니다.
Js의 Date 처리 기능을 최대한 쉽게 향상시키기 위해 Js의 Date 객체에는 두 가지 확장만 적용됩니다.
/**
* 현재 시간의 UTC 타임스탬프를 가져옵니다.
* @return {int} 유닉스 타임스탬프
*/
Date.prototype.getTimeUTC = 함수() {
return this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* 현재 동작하고 있는 시간을 해당 시간대로 변경(주로 다른 시간대로의 시간을 변환하는데 사용)
*
* @param {int} tzo 원래 시간대-12~13
* @param {int} tzo 대상 시간대-12~13은 현재 시간대가 기본값입니다.
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
쪼 = 쪼 * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
/**
* 현재 시간의 UTC 타임스탬프를 가져옵니다.
* @return {int} 유닉스 타임스탬프
*/
Date.prototype.getTimeUTC = 함수() {
return this.getTime() + this.getTimezoneOffset() * 60 * 1000;
}
/**
* 현재 동작하고 있는 시간을 해당 시간대로 변경(주로 다른 시간대로의 시간을 변환하는데 사용)
*
* @param {int} tzo 원래 시간대-12~13
* @param {int} tzo 대상 시간대-12~13은 현재 시간대가 기본값입니다.
*/
Date.prototype.changeTimezone = function(tzo,tzn) {
쪼 = 쪼 * 60;
tzn = tzn ? tzn * 60 : -this.getTimezoneOffset();
this.setTime(this.getTime() - (tzo - tzn) * 60 * 1000);
}
이때 확장된 Js Date 객체를 기반으로 새로운 개발이 가능해집니다.
아이디어는 매우 간단합니다. 즉, 먼저changeTimezone 메소드를 통해 모든 형식 및 시간대의 시간을 현재 시스템과 동일한 시간대로 전송한 다음 getTimeUTC에 의해 생성된 UTC Unix 타임스탬프에서 작동합니다.
예를 들어, +8 시간대의 2008년 6월 4일 16시 30분과 +9 시간대의 현재 시간 사이의 시차를 계산하고 싶습니다.
// 자동으로 유닉스 타임스탬프로 구문 분석합니다.
var p = Date.parse('2008년 6월 4일, 16:30');
var time_parse = 새로운 날짜(p);
//비교할 시간대로 변환
time_parse.changeTimezone(8,9);
var time_now = 새로운 날짜();
//비교를 위해 UTC로 변환
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
Alert('차이' + parsInt(der / 1000 / 60) + '분');
//유닉스 타임스탬프로 자동으로 구문 분석
var p = Date.parse('4 Jun 2008, 16:30');
var time_parse = new Date(p);
//비교할 시간대로 변환합니다.
time_parse.changeTimezone(8,9);
var time_now = new Date();
//비교를 위해 UTC로 변환
var der = time_now.getTimeUTC() - time_parse.getTimeUTC();
Alert('차이' + parsInt(der / 1000 / 60) + '분');
물론 더 간단한 코드도 있지만 복잡한 응용 프로그램에서 아이디어를 명확하게 하는 것이 오류 가능성이 적습니다.
이 블로그의 왼쪽 열에 XX일 XX개월 전과 같이 보다 사용자 친화적인 알림을 구현하려면 필요에 따라 여기에서 추가로 확장할 수 있습니다. 구현된 기능은 다음과 같습니다
/**
*는 지정된 시간과 현재 사이의 차이를 나타냅니다.
*
* @param {int} t 비교할 시간 unix 타임스탬프(UTC)
* @param {int} n은 표준 시간이며, 기본값은 현재 시간 유닉스 타임스탬프(UTC)입니다.
* @return {string} 차이 시간 표현
*/
Date.prototype.derTime = 함수(t,n) {
var n = n ? n : this.getTimeUTC();
함수 ms2min(ms) {
returnparseInt(ms / 1000 / 60);
}
var der = ms2min(n - t);
var ba = der > 0 ? '이전' : '이후';
der = Math.abs(der);
var res = '';
if(der == 0) {
res = '그냥';
}
else if(0 < der && der < 60) {
res = der + '분' + ba;
}
else if(60 <= der && der < 24 * 60) {
var min = der % 60 == 0 ? '' : String(der % 60) + '분';
res = String(parseInt(der / 60)) + '시간' + min + ba;
}
else if(der >= 24 * 60 && der < 24 * 60 * 31) {
res = String(parseInt(der / 60 / 24)) + '일' + ba;
}
else if(der >= 24 * 60 * 31 && der < 24* 60 * 365) {
res = String(parseInt(der / 60 / 24 / 31)) + '월' + ba;
}
else if(der > 24 * 60 * 365) {
res = String(parseInt(der / 60 / 24 / 365)) + '연도' + ba;
}
해상도를 반환;
}
/**
* 시간 필드와 현재 시간의 차이를 구문 분석합니다.
* @param {string} i
* @param {int} 시간대-12~13
*/
함수 time_der(i,tz) {
var p = Date.parse(i);
만약(!p) {
내가 반환;
}
var time_parse = 새로운 날짜(p);
if(tz != 정의되지 않음) {
time_parse.changeTimezone(tz);
}
var time_now = 새로운 날짜();
return time_now.derTime(time_parse.getTimeUTC());