JavaScript 확장을위한 우리의 일반적인 관행 중 하나는 날짜 확장입니다. 날짜 클래스는 getDate (), getMinute () ...과 같은 날짜 요소를 얻는 몇 가지 방법 만 제공하지만 특정 문자열로 변환되지 않았습니다. 따라서 이러한 미묘한 방법을 사용하여 원하는 날짜 문자열 양식을 캡슐화하고 결합하십시오. 일반적으로,이 형식화 함수는 날짜 개체의 프로토 타입에서 정의 될 수 있거나 독립적으로 작성 될 수 있습니다. 정의 프로토 타입의 작업은 날짜 객체의 기본 메소드 인 것처럼 날짜. . 그러나 정의 프로토 타입 방법은 "침입"JS 프로토 타입의 부족으로 의심됩니다. 이 문제는 API를 설계 할 때 고려해야합니다. 저의 제안은 사용자가 자신의 판단에 따라 결정을 내리지 만 전화 방법은 다르며 프로세스의 논리는 프로세스에 영향을 미치지 않습니다.
다음 예는 독립적 인 함수, 독립 형식 함수에 의해 작성된 JavaScript 날짜의 서식 함수입니다. 이 형식의 지식 지점으로 돌아가서, 우리는 어떻게 그리고 어떤 원칙을 사용했는지 조사했습니다. indexof ()+substr ()와 같은 기존의 문자열 스티치는 분명히 낮은 효율성 일뿐 만 아니라 정규 표현식을 도입하는 데 여전히 적합합니다 그런 다음 결과의 결과를 일치시킵니다. 먼저 Steven Levithan의 예를 살펴 보겠습니다.
다음과 같이 코드 코드를 복사하십시오.
/**
* 날짜 형식 1.2.3
* @Credit Steven Levithan <Stevenlevithan.com> Scott Trenda <scott.trenda.net> 및 Kris Kowal <cixar.com/~kris.kowal/
* 날짜, 마스터 또는 데이트 및 마스터를 수락합니다.
* 주어진 날짜의 형식화 된 버전을 반환합니다.
* 날짜는 현재 날짜/시간으로 기본적으로 표시됩니다.
* 마스크는 dateformats.default입니다.
*/
dateformat = (function () {
// 정규 노트, 1. 토큰, (? :) 비 -포획 그룹을 나타냅니다./1 리버스 참조 (생각 : {1,2} [llosz]의 의미에 따라); 여기에서는 모든 캐릭터가 일치하는 것이 좋습니다 또는 단일 따옴표).
vartoken = /d {1,4}. /g,
// 2. TimeZone, [PMCEA] [SDP]는 두 문자의 소비를 생성합니다.
TimeZone = // b (? : [pmcea] [sdp] t | (? : 태평양 | 산 | 중앙 | 동부 | 대서양) (? : 표준 | 일광 | 우선) 시간 | (? : gmt | utc) (? -+]/d {4})?)/b/g,
timezoneclip =/[^-+/da-z]/g,
// 비션 충전 문자 또는 포지셔닝 수를 배치 할 수 있습니다.
PAD = 함수 (값, LEN) {
값 = 문자열 (val);
len = len ||.
while (val.length <len) val = "0" + 값;
반환 값;
};
// 이전에 설명 된 변수가 일정 해졌고 아래에 반환 된 매개 변수가 실시간의 기능입니다. 이것은 글쓰기를 마감하여 구현됩니다. 영어로 된 의견으로 속도를 높일 수 있습니다.
// regexes 및 지원 함수는 폐쇄를 통해 캐시됩니다
// 매개 변수 설명 : 날짜 : 날짜 또는 새 날짜;
반환 기능 (날짜, 마스크, UTC) {
var i18n = dateformat.i18n;
var masks = dateformat.masks;
// 다른 Args를 건너 뛰면 UTC를 제공 할 수 없습니다 ( "UTC :"마스크 접두사 사용)
// 매개 변수가 하나만 있으면이 매개 변수는 숫자를 포함하지 않는 문자열이며 마스크로 간주됩니다. 날짜는 다음 if의 새 날짜에 의해 생성되므로 날짜는 현재 날짜입니다.
if (argumes.length == 1 && object.prototype.tostring.call (date) == "[Object String]"&&! // d /test (date)) {
마스크 = 날짜;
날짜 = 정의되지 않은;
}
// 날짜를 전달하십시오
날짜 = 날짜? 새로운 날짜 (날짜) : 새 날짜;
if (isnan (date)) Throw SyntaxError ( "유효하지 않은 날짜");
// 이전에 아무리 지정하더라도 많은 경우에 판단하여 마스크가 무엇인지 분명합니다. ||의 기술에주의하십시오.
마스크 = 문자열 (마스크 [마스크] || 마스크 || 마스크 [ "기본"]);
// 마스크를 통해 UTC 인수를 설정할 수 있습니다
if (mask.slice (0, 4) == "utc :") {{
마스크 = mask.slice (4);
utc = true;
}
// 두 가지 경우, 상황과 일반을 UTC 형식으로 사용하십시오. JS의 문자 인덱스는이 방법의 구성원에게도 반환 할 수 있습니다.
var_ = utc? "getUtc": "get",
d = 날짜 [_ + "date"] ,,,,
d = 날짜 [_ + "day"] () ,,,
m = 날짜 [_ + "month"] () ,,,
y = 날짜 [_ + "Fullear"] (),
h = 날짜 [_ + "hold"] () ,,,,
m = 날짜 [_ + "ming"] (),
s = 날짜 [_ + "seconds"] () ,,,,
l = 날짜 [_ + "milliseconds"] () ,,,,
o = UTC? 0 : date.getTimezoneOffset (),
깃발 = {
D : D,
DD : PAD (D),
DDD : i18n.dayNames [d],
dddd : i18n.daynames [d + 7], // 비트 너비 : 7, dateformat.daynames를 참조하십시오.
M : M + 1, // 0부터 시작합니다
MM : PAD (M + 1) ,,,
MMM : i18n.monthNames [M],
mmmm : i18n.monthnames [m + 12], // 비트 너비 : 12, dateformat.monthnames 참조
YY : String (y) .Slice (2), // String Slice () 사용
yyyy : y,
h : h % 12 ||.
HH : 패드 (H % 12 || 12),
H : H,
HH : 패드 (H),
Mm,
MM : PAD (M),
봄 여름 시즌,
SS : PAD (S),
L : PAD (L, 3), // max, 999ms
L : PAD (L> 99? Math.Round (L / 10) : L),
// 영향력을 후원합니다
T : H <12? "A": "P",
TT : H <12? "AM": "PM",
T : H <12? "A": "P",
TT : H <12? "AM": "PM",
//이 단계에서 시간대를 찾아 다루십시오.
// 이전 기사는 TimeZone, timezoneClip =/[^-+/da-z]/g입니다.
// 길이 ... UTC ... 정보를 포함하여 리턴 날짜의 문자열 형식을 문자
// 그렇지 않으면 [ ""] .pop () 빈 문자를 반환합니다.
Z : UTC? "utc": (string (date). match (timezone) [ "). ")," ")," ")," ")," "),", ""), ""), ""), ""), ""), ""), ""), ""), "") ") , "" "
// 4- 비트 타임 ZONEOFFSET
o : (o> 0? "-": " +") + pad (Math.floor (math.abs (o) / 60) * 100 + math.abs (o) % 60, 4),
// D의 단일 자리에 따라 영어 [ "Th", "st", "nd", "rd"]를 찾으십시오.
S : [ "Th", "st", "nd", "rd"] [d % 10> 3 : (d % 100 -d % 10! = 10) * d % 10]
};
return mask.replace (토큰, 함수 ($ 0 /*는 $ 0입니다. $ 1, $ 1, $ 2는* /) {) {) {) {) {) {) {) {) {) { ) {)
// 특정 객체에서 지정된 속성을 감지하는 방법은 무엇입니까? 그냥 감지하십시오!
// $ 0.slice (1, $ 0.length -1);?
깃발로 $ 0?
});
};
}) ();
이 코드는 날짜 처리에 대해 포괄적 인 것으로 간주되므로 미스터리를보기 위해 원칙을 입력합니다. 날짜를 다루는 방법!
날짜 문자열 템플릿에서, 우리는 yyyy/mm/dd 등의 의미있는 상징을 각각 사용하기로 동의했습니다. 각각 y와 같은 날짜의 특정 요소, 즉 1 년, 월, 대문자 인 경우에도해야합니다. 구별 된 것에주의를 기울이십시오. 자본 M은 1 분을 나타냅니다. 요컨대, 이것은 표준화 된 계약, 즉 위의 코드의 "마스크"가이 계약에 따라 서식 모드의 매개 변수를 입력하면 인쇄 된 문자열의 날짜 유형 값을 출력 할 수 있습니다. 분석 날짜는 먼저 마스크의 전체 요구 사항에 따라 각 날짜의 각 요소를 하나씩 가져옵니다 (getDate (), getMinute ()) ... 그런 다음 실제를 따라갈 수 있습니다). 마스크 조건, 즉, 문자열 템플릿과 요소를 교체하기 위해 .replace (일반, 요소) 메소드를 마스크하고 교체 프로세스는 여전히 플래그와 일치하는 비교 테이블입니다. 일반 부분의 경우 키는 토큰과 replace () 함수를 이해하는 과정입니다. 내부 세부 사항을 이해하려면 위의 코드 주석에 참여하십시오.
매번 긴 마스크 문자열을 입력하는 것이 피곤하지 않습니까? 지속적인 방법을 정의하여 워크로드를 줄일 수 있습니다.
다음과 같이 코드 코드를 복사하십시오.
dateformat.masks = {
"기본값": "DDD MMM DD YYYY HH : MM : SS",
Shortdate : "m/d/yy",
ShortDate2 : "YY/M/D/H : MM : SS",,
MediumDate : "Mmm D, Yyyy",
Longdate : "mmmm d, yyyy",
Fulldate : "DDDD, MMMM D, YYYY",
짧은 시간 : "H : MM TT",
중간 시간 : "H : MM : SS TT",
오랜 시간 : "H : MM : SS TT Z",
Isodate : "Yyyy-MM-DD",
동위 원소 : "HH : MM : SS",
ISODATETIME : "yyyy-mm-dd't't't't'hh : mm : ss",
isoutcdateTime : "utc : yyyyy-mm-dd't't't't't'hh : mm : ss'z '"
// 중국 날짜 @Edit 2010.8.11을 추가하십시오
, Chinesetate : 'yyyy 년 mm 달 dd day hh time mm points'
}
dateformat.i18n = {
데이 이름 : [[[
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"
] ,,,
월 이름 : [[[
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "Dec", "Dec",
"1 월", "2 월", "3 월", "4 월", "5 월", "6 월", "7 월", "8 월", "9 월", "10 월", "11 월", "12 월"
]]
};
Steve의 DateFormat은 대부분의 날짜 변환 작업을 완료하기에 충분하지만 광대 한 코드에서는 20 줄의 코드가없는 더 나은 솔루션을 찾았으며 정기적으로 사용하는 것이 무료입니다. 그림자!
다음과 같이 코드 코드를 복사하십시오.
date.prototype.format = function (format) // 저자 : Meizz
{{
var o = {
"m+": this.getmonth () +1, // 월
"d+": this.getDate (), // day
"H+": this.gethours (), // 시간
"m+": this.getMinutes (), // 분
"s+": this.getSeconds (), // 두 번째
"Q+": Math.floor ((this.getMonth ())+3), // 쿼터
"S": this.getMilliseconds () // millisecond
}
if (/(y+)/. test (format)) format = format.replace (regexp. $ 1,
(this.getlyear ()+"").
for (var k in o) if (new regexp ( "(" " + k +"). test (format))
format = format.replace (regexp. $ 1,
regexp. $ 1. length == 1?
( "00"+ o [k]).
반환 형식;
}
ALERT (새 날짜 (). 형식 ( "YYYY-MM-DD HH : MM : SS");
이 원리는 Steve 방법과 유사하지만 집중된 코드는 기술과 포괄적 성을 통합합니다. 12 번째 소스 코드에서 시작하여 Test () 메소드는 일치하는 최소 함수를 감지 할 수있을뿐만 아니라 실제로 일치하는 결과가 발생하지 않으며 사실이 아닙니다). 그런 다음 새로운 regexp를 사용하여 문자열 형태로 정규 표현식 인스턴스를 만들면 O와 직접 해시 테이블과 직접 연결되어 있기 때문에 영리한 장소입니다! 그런 다음 법에 따르면 조롱박은 먼저 삶의 일치에 대해 테스트하고 일부는 교체합니다.
또한 ( "00" + o [k]) (String (O [k])도 흥미로운 장소입니다. 원래 목적은 어레이의 마지막 두 가지를 가져가는 것이 었습니다. 이것은 substr () 메소드의 첫 번째 매개 변수를 종합적으로 사용하는 기술입니다. 결과적으로, 우리가 몇 자리 숫자를 미리 추가하고 원래 고정 문자열 길이는 변하지 않고 (O [k] .length), 몇 자리 숫자가 남았습니다. (PS "00"은 배치 기호와 동일하며 차이가없는 대신 다른 문자열 "XX"와 함께 사용할 수 있습니다)
여전히이 코드가 많은 어려움이 있다고 생각하십니까? 우리는 Moon Shadow의 기능을 강력한 가독성으로 재 작성하려고 노력했지만 모든 기술이 절약 될 수 있다고 생각합니다. Yueying 코드.
다음과 같이 코드 코드를 복사하십시오.
날짜 = {
형식 : 함수 (날짜, 형식) {
날짜 = 새 날짜 (날짜);
날짜 = {
연도 : 날짜 .getlyear ()
, 월 : date.getmonth () + 1 // 월, 월은 0에서 시작됩니다.
, day : date.getDate ()
, 시간 : 날짜 .gethours () ()
, 분 : date.getMinutes ()
, 두 번째 : date.getSeconds ()
, milute : date.getmilliseconds ()
};
var
성냥
, reg = /(y+) |
while ((match = reg.exec (format))! = null) {
매치 = 일치 [0];
if (/y/i.test (match)) {
format = format.replace (match, date.year);
}
if (match.indexof ( 'M')! = -1) {
format = format.replace (match, date.month);
}
if (match.indexof ( 'd')! = -1) {
format = format.replace (match, date.day);
}
if (match.indexof ( 'h')! = -1) {
format = format.replace (match, date.hour);
}
if (match.indexof ( 'M')! = -1) {
format = format.replace (일치, 날짜.
}
if (match.indexof ( 's')! = -1) {
format = format.replace (일치, 날짜 .second);
}
if (match.indexof ( 'u')! = -1) {
format = format.replace (match, date.milute);
}
}
반환 형식;
}
};
2011--1-7 :
문자열을 JS 표준 날짜로 어떻게 돌릴 수 있습니까? 새로운 내선이 어떻게 이루어 졌는지 보시겠습니까?
다음과 같이 코드 코드를 복사하십시오.
/**
* 특정 형식 형식 형식에 따라.
* 지정된 형식 패턴을 사용하여 형식화 된 날짜 사용자를 구문 분석하십시오.
* @param {string/date} 형식에 대한 값 (문자열은 JavaScript 날짜 개체의 형식 요구 사항을 충족해야합니다. "http://www.w.w3schools.com/jsref/jsref_parse.asp"> parse () </a>) 형식으로의 값 (Strings는 Javascrift가 기대하는 형식을 준수해야합니다.
* 날짜 개체의 <a href = "http://www.w3schools.com/jsref/jsref_parse.asp"mce_href = "http://www.w3schools.com/jsref_parse.asp"</a> 메소드 ))
* @param {String} 형식 (선택 사항) 형식 형식 형식 문자열. (선택 사항) (선택 사항) 유효한 날짜 형식 문자열 (기본값으로 'm/d/y')
* @return {String}이 문자열을 형식화했습니다. 형식 날짜 문자열
*/
날짜 : 함수 (v, 형식) {
if (! v) {{
반품 "" ";
}
if (! ext.isdate (v)) {
v = 새 날짜 (date.pars (v));
}
return v.dateformat (format || ext.util.format.defaultDateFormat);
}
1970 년의 밀리 초 수를 계산하여 날짜 생성자가 날짜를 결정할 수 있습니까? —— IP, 이것은 괜찮습니다. 즉, 다른 방식으로,이 문제의 관점에서 볼 때 JS 날짜가 가장 작은 장치는 밀리 초입니다.
최종 버전 :
다음과 같이 코드 코드를 복사하십시오.
/**
* 날짜 서식. 자세한 내용은 블로그 게시물을 참조하십시오 : http://blog.csdn.net/zhangxin09/archive/2011/01/6111294.aspx
* 예 : 새로운 날짜 ().
* @param {String} 형식
* @return {String}
*/
date.prototype.format = function (format) {
var $ 1, o = {
"m +": this.getmonth () + 1, // 월, 0부터 시작
"d+": this.getDate (), // 날짜
"H+": this.gethours (), // 시간
"m+": this.getMinutes (), // 분
"s+": this.getSeconds (), // 초
// Quate Quarter
"Q +": Math.floor ((this.getMonth () + 3) / 3),
"S": this.getMilliseconds () // 수천 초
};
var 키, 가치;
if (//y+)/.test (format)) {{
$ 1 = regexp.
format = format.replace ($ 1, String (this.getLyEar ()). substr (4- $ 1));
}
for (o in o) {// 매개 변수가 지정되지 않은 경우 하위 스트링은 StringVar의 끝까지 계속됩니다.
if (new regexp ( "("( " + key +")) "). test (format) {
$ 1 = regexp.
value = string (o [key]),
value = $ 1. length == 1?
format = format.replace ($ 1, value);
}
}
반환 형식;
}