JavaScriptの拡張のためのより一般的なプラクティスの1つは、date.prototypeの拡張です。日付クラスは、getdate()、getminute()などの日付要素を取得するいくつかの方法のみを提供していることがわかっているため、特定の文字列に変換されたフォーマットメソッドはありません。したがって、これらの微妙な方法を使用して、必要な日付文字列フォームをカプセル化して組み合わせます。一般的に言えば、この形式化関数は、日付オブジェクトのプロトタイプで定義することも、独立して記述することもできます。定義プロトタイプの操作は、date.prototype.format = function(date){...}などです。 。ただし、定義プロトタイプメソッドは、「侵略」JSプロトタイプの欠如がわずかに疑われています。この問題は、APIを設計する際に考慮する必要があります。私の提案は、ユーザーは自分の判断に従って決定を下すことですが、呼び出しの方法は異なり、プロセスの論理はプロセスに影響しません。
次の例は、独立した形式関数である独立関数によって記述されたJavaScript日付のフォーマット関数です。フォーマットのこの知識のポイントに戻ると、どのようにどのような原則が使用されたかを調べました。 Indexof()+substr()などの従来の文字列ステッチは、明らかに低効率であるだけでなく、正規表現を導入するのにも適しています次に、結果の結果を一致させます。まず、スティーブン・レヴィサンの例を見てみましょう:
次のようにコードコードをコピーします。
/**
*日付形式1.2.3
* @credit Steven Levithan <Stevenlevithan.com> Scott Trenda <Scott.trenda.net>およびKris Kowal <cixar.com/~kris.kowal/>
*日付、マスター、または日付とマスターを受け入れます。
*指定された日付のフォーマットバージョンを返します。
*日付はデフォルトで現在の日付/時刻です。
*マスクはDATEFORMAT.DEFAULTにデフォルトです。
*/
dateformat =(function(){
//通常のノート、1。Token、(?:)非キャプチャグループを示します。ここでは、あらゆるキャラクターを意味しますが、l |または単一の引用符)。
vartoken = /d {1,4} | /g、
//2。TimeZone、[PMCEA] [SDP]は、2つの文字の消費を生成します。
TimeZone = // b(?:[PMCEA] [SDP] T |(?:Pacific | Mountain | Central | Eastern | Atlantic)(?:Standard | Daylight | prevailing)time |(?:gmt | utc)(?[?[?] - +]/d {4})?)/b/g、
timezoneclip =/[^ - +/da-z]/g、
// 2ビット未満の充填キャラクター、または位置決めの数を配置できます
pad = function(value、len){
value = string(val);
len = len ||。
while(val.length <len)val = "0" + value;
返品値。
};
//前述の変数が一定になり、以下に返されるパラメーターがリアルタイムの関数であるため、なぜ関数を返すのか。これは、執筆を閉じることによって実装されます。英語のコメントとして、スピードアップできます。
//正規表現とサポート機能は、閉鎖によりキャッシュされます
//パラメーター説明:日付:新しい日付:文字列のフォーマット日:
return function(date、mask、utc){
var i18n = dateformat.i18n;
var masks = dateformat.masks;
//他のargをスキップすると、UTCを提供できません(「UTC:」マスクプレフィックスを使用)
//パラメーターが1つしかない場合、このパラメーターは、マスクと見なされる番号を含む文字列です。日付は次のIFの新しい日付によって生成されるため、日付は現在の日付です。
if(argumes.length == 1 && object.prototype.tostring.call(date)== "[object string]" &&!// d /test(date)){
mask = date;
日付=未定義;
}
//日付の合格3つのaplies date.parse、必要に応じて
日付=新しい日付(日付):新しい日付;
if(isnan(date))shyntaxerror( "invalid date");
//多くの場合、以前に指定されていても、マスクが何であるかは明らかです。 ||のスキルに注意してください。
mask = string(masks [mask] || mask || masks ["default"]);
//マスクを介してUTC引数を設定することを許可します
if(mask.slice(0、4)== "utc:"){{{
mask = mask.slice(4);
utc = true;
}
// 2つの場合、状況と一般的なUTC形式を使用します。 JSのリテラルインデックスは、メソッドのメンバーにも戻ることができることに注意してください。
var_ = utc? "get"、
d = date [_ + "date"] ,,,
d = date [_ + "day"](),,
m = date [_ + "month"](),,
y = date [_ + "fullyear"]()、
h = date [_ + "hold"](),,,,,
m = date [_ + "minutes"]()、
s = date [_ + "秒"](),,,,,
l = date [_ + "milliseconds"](),,
o = utc?
フラグ= {
D:D、
DD:パッド(d)、
DDD:i18n.daynames [d]、
dddd:i18n.daynames [d + 7]、// bit width:7、dateformat.daynamesを参照してください。
M:M + 1、// 0から始まります
MM:パッド(M + 1)、、
MMM:i18n.monthnames [m]、
mmmm:i18n.monthnames [m + 12]、// bit width:12、dateformat.monthnamesを参照
yy:string(y).slice(2)、// string slice()usage
yyyy:y、
H:h%12 || // hは12時間を意味し、hは12時間を分割し、残りの結果は12時間です。
HH:パッド(H%12 || 12)、
H:H、
HH:パッド(H)、
M:M、
MM:パッド(M)、
S:S、
SS:パッド(s)、
L:パッド(L、3)、//最大、999ms
L:パッド(L> 99?Math.Round(L / 10):L)、
//影響力を愛用します
T:h <12? "p"
TT:h <12?
T:h <12? "p"
TT:h <12?
//このステップでTimeZoneを探して、それを扱ってください。
//前の記事はTimeZone、TimeZoneClip =/[^ - +/da-z]/gです。
//長いutc ...情報を含む、返品日の文字列形式を文字列
//そうでない場合、[""] .pop()空の文字を返します
Z:UTC? ")、")、 ")、" ")、" ")、" ")、")、 ")、" ")、")、 "")、 "")、 "")、 "")、 ")、")、 ""))))))) 、 ""
// 4-ビットTimeZoneOffset
O:(o> 0? " - ": " +") + pad(math.floor(math.abs(o) / 60) * 100 + math.abs(o)%60、4)、
//英語で["th"、 "st"、 "nd"、 "rd"]で見つけます。
s:["th"、 "st"、 "nd"、 "rd"] [d%10> 3?
};
return mask.replace(token、function($ 0 /* is good $ 0、$ 1、$ 1、$ 2が占有* /){){){){){){){){){){){){){){){){){){){){){) ){)
//特定のオブジェクトで指定された属性を検出する方法は?それを検出するだけです!
// $ 0.SLICE(1、$ 0.Length -1);
フラグに$ 0を返しますか?
});
};
})();
コードは日付の処理について包括的に包括的と見なされるため、その原則を入力して、その謎、つまり日付に対処する方法を確認します!
日付の文字列テンプレートでは、Yyyy/mm/ddなどの意味のあるシンボルをそれぞれ使用することに同意しました。これは、yのように、1年、月、月のような日付の特定の要素を示しています。 Distinguishedに注意してください。要するに、これは標準化された契約です。つまり、この契約のフォーマットモードのパラメーターを入力するために、上記のコードの「マスク」であることです。分析の日付については、最初にマスクの要件全体に従って、各日付の各要素を1つずつ(getDate()、getMinute())...すぐに入手できます)。マスクの条件、つまり、文字列テンプレートと要素を置き換えるための.replace(通常、要素)メソッドをマスクします。また、交換プロセスは、フラグをフラグで一致させる比較テーブルです。通常の部分に関しては、キーはトークンと置換()関数を理解するプロセスです。上記のコードコメントに参加して、内部の詳細を理解してください。
毎回長いマスクストリングに入るのは疲れませんか?一定の方法を定義することにより、ワークロードを減らすことができます。
次のようにコードコードをコピーします。
dateformat.masks = {
「デフォルト」:「DDD MMM DD YYYY HH:MM:SS」、
短命:「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"、
ISOTIME:「HH:MM:SS」、
IsodateTime: "yyyy-mm-ddd't't'hh:mm:ss"、
isoutcdateTime: "utc:yyyyy-mm-ddd't't't'hh:mm:ss'z ''" "
//中国の日付を追加@edit 2010.8.11
、Chinesetate: 'yyyy year mm month dd day hh time mm points' '
}
dateformat.i18n = {
デイネーム:[[[
「太陽」、「モン」、「キン」、「ウェッジ」、「トゥー」、「金」、「土」、
「日曜日」、「月曜日」、「火曜日」、「水曜日」、「木曜日」、「金曜日」、「土曜日」
] 、、、
月の名前:[[[
「1月」、「2月」、「3月」、「4月」、「5月」、「ジュン」、「7月」、「8月」、「9月」、「10月」、「11月」、「12月」、
「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()、// hour
「M+」:this.getMinutes()、// minuts
「S+」:this.getSeconds()、// second
「Q+」:math.floor((this.getmonth())+3)、// Quarter
「S」:this.getMilliseConds()// millisecond
}
if(/(y+)/。test(format))format = format.replace(regexp。$ 1、
(this.getSultyear()+"")。
for(o in o)if(new regexp( "(" " + k +")。テスト(フォーマット)))
format = format.replace(regexp。$ 1、
regexp。
( "00"+ o [k])。
返品形式。
}
alert(new date()。形式( "yyyy-mm-dd hh:mm:ss");
原則はSteve Methodに似ていますが、より集中したコードはスキルと包括性を統合します。ソースコードの12行から、TEST()メソッドは、マッチングの最小関数を検出できますが、実際には結果が生成されません。次に、新しいregexpを使用して、文字列の形で正規表現のインスタンスを作成します。これは巧妙な場所です。これは、oと直接ハッシュテーブルに直接接続されているためです。それから、法律によれば、ひょうたんは最初に人生のマッチングについてテストされ、一部の場合はそれを置き換えます。
さらに、( "00" + o [k])。当初の目的は、アレイの最後の2つを取ることでした。これは、substr()メソッドを包括的に使用するスキルです。その結果、事前に追加した数字の数と元の固定された文字列の長さは変更されていません(o [k] .length)、次に数桁が残っていました。 (PS "00"は配置記号と同等であり、違いがないのではなく、他の文字列「xx」で使用することもできます)
このコードには多くの困難があるとまだ感じていますか?私たちは、ムーンシャドウの強力な読み物を書き直そうとしましたが、これはすべてのテクニックを節約できないと信じています。 Yueyingのコード。
次のようにコードコードをコピーします。
日付= {
形式:function(date、format){
date = new Date(date);
日付= {
年:date.getThyear()
、月:date.getmonth() + 1 //月、月はゼロから始まります
、day:date.getDate()
、hour:date.gethours()()
、minute:date.getMinutes()
、2番目:date.getSeconds()
、ミルート:date.getmilliseconds()
};
var
マッチ
、reg = /(y+)|
while((match = reg.exec(format))!= null){
Match = Match [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(match、date.minute);
}
if(match.indexof( 's')!= -1){
format = format.replace(match、date.second);
}
if(match.indexof( 'u')!= -1){
format = format.replace(match、date.milute);
}
}
返品形式。
}
};
2011-1-7:
文字列をJS標準日付に変えるにはどうすればよいですか?新しいextがどのように行われるか見てみましょうか?
次のようにコードコードをコピーします。
/**
*特定のフォーマットフォーマット日に従って。
*指定されたフォーマットパターンを使用して、フォーマットされた日付ユーザーの値を解析します。
* @param {string/date} value to formatting(文字列はjavascript dateオブジェクトの形式要件を満たす必要があります。 "http://www.w.w.w3schools.com/jsref/jsref_parse.asp"> parse()</a>)format to format(文字列はjavascriftによって予想される形式に準拠する必要があります
*日付オブジェクトの<a href = "http://www.w3schools.com/jsref/jsref_parse.asp" mce_href = "http://www.w3schools.com/jsref_parse.asp"(parse ")</a> method method ))
* @param {string}フォーマット(オプション)フォーマットフォーマット文字列。 (オプション)(オプション)有効な日付形式の文字列(デフォルトは 'm/d/y'にデフォルト)
* @return {string}は文字列をフォーマットしました。フォーマットされた日付文字列
*/
日付:function(v、format){
if(!v){{
戻る "" ";
}
if(!ext.isdate(v)){
v = new date(date.pars(v));
}
return v.dateformat(format || ext.util.format.defaultdateformat);
}
日付コンストラクターは、1970年のミリ秒数を計算して日付を決定できますか? —IP、これは大丈夫です - つまり、逆に、この問題の観点から見ると、JS日付が最小のユニットはミリ秒です。
最終バージョン:
次のようにコードコードをコピーします。
/**
*日付のフォーマット。詳細については、ブログ投稿:http://blog.csdn.net/zhangxin09/archive/2011/01/6111294.aspxを参照してください
* EG:new Date()
* @param {string}形式
* @return {string}
*/
date.prototype.format = function(format){
var $ 1、o = {
「M +」:this.getMonth() + 1、//月、0から開始
「D+」:this.getDate()、//日付
「H+」:this.gethours()、// hours
「M+」:this.getMinutes()、//分
「S+」:this.getSeconds()、//秒
// quate四半期
「Q +」:math.floor((this.getmonth() + 3) / 3)、
「S」:this.getMilliseConds()//数千秒
};
varキー、値;
if(//y+)/.test(format)){{
$ 1 = regexp。
format = format.replace($ 1、string(this.getTullear())。substr(4- $ 1));
}
(oのキー){//パラメーターが指定されていない場合、サブストリングはstringvarの終わりまで続きます。
if(new regexp( "(" + key + ")")。test(format){
$ 1 = regexp。
value = string(o [key])、
値= $ 1.length == 1?( "00" + value)。
format = format.replace($ 1、value);
}
}
返品形式。
}