Eine unserer häufigeren Praktiken für die JavaScript -Erweiterung ist die Erweiterung des Datums.Prototyps. Da wir wissen, dass die Datumsklasse nur verschiedene Methoden zum Erhalten von Datumselementen enthält, z. Verwenden Sie daher diese subtilen Methoden, um das gewünschte Datumszeichenformular zu verkapulieren und zu kombinieren. Im Allgemeinen kann diese Formatisierungsfunktion im Prototyp des Datumsobjekts definiert oder unabhängig geschrieben werden. Der Betrieb des Definitionsprototyps ist wie Datum. . Die Definitionsprototypmethode wird jedoch geringfügig des Mangels an "Invasions" -JS -Prototypen vermutet. Dieses Problem muss beim Entwerfen von API berücksichtigt werden. Mein Vorschlag ist, dass Benutzer Entscheidungen gemäß ihrem eigenen Urteilsvermögen treffen, aber die Aufrufmethode ist unterschiedlich, und die Logik des Prozesses wirkt sich nicht auf den Prozess aus.
Das folgende Beispiel ist die Formatierungsfunktion des JavaScript -Datums von Independent Functions, einer unabhängigen Formatfunktion. Zurück zu diesem Wissenspunkt der Formatierung untersuchten wir, wie und welche Prinzipien verwendet wurden. Obwohl traditionelle String -Nähte wie indexof ()+substr () erreicht werden können, ist es offensichtlich nicht nur niedrig, sondern auch der Code lang. dann entsprechen die Ergebnisse der Ergebnisse. Schauen wir uns zunächst Beispiele von Steven Levithan an:
Kopieren Sie den Code -Code wie folgt:
/**
* Datumsformat 1.2.3
* @credit Steven Levithan <Stevenlevithan.com> Enthält Verbesserungen von Scott Trenda <Scott.trenda.net> und Kris Kowal <cixar.com/~kris.kowal/>
* Akzeptiert ein Datum, einen Meister oder ein Datum und einen Meister.
* Geben Sie eine formatierte Version des angegebenen Datums zurück.
* Das Datum stand zum aktuellen Datum/der aktuellen Uhrzeit.
* Die Maske stellt dateFormat aus.
*/
DateFormat = (function () {
// reguläre Notizen, 1. Token, (? :) Geben Sie die Nicht -Capture -Gruppe an. Hier bedeutet es, dass es in der Klammer einfach ist, jeden Charakter zu entsprechen, aber es wird nicht verstanden. oder einzelne Zitate).
vartoken = /d {1,4} | /G,
// 2. TimeZone, [PMCEA] [SDP] erzeugt den Verbrauch von zwei Zeichen;
timezone = // b (?: [pmcea] [sdp] t | (?: pacific | munty | zentral | östlich | atlantic) (? -+]/d {4})?)/b/g,
TimeZoneclip =/[^-+/da-z]/g,
// In weniger als zwei Bit -Füllzeichen oder die Anzahl der Positionierung kann positioniert werden
pad = function (value, len) {
value = string (val);
len = len || 2;
While (Val.Length <len) val = "0" + Wert;
Rückgabewert;
};
// Warum eine Funktion zurückgibt, da die zuvor erklärten Variablen konstant geworden sind und die unten zurückgegebenen Parameter die Funktion der Echtzeit sind. Dies wird durch Schließen des Schreibens implementiert. Als Kommentare in Englisch können Sie beschleunigen.
// Regexes und unterstützende Funktionen werden durch Schließung zwischengespeichert
// Parameter Beschreibung: Datum: Datum oder neuer Datum;
Rückgabefunktion (Datum, Maske, UTC) {
var i18n = dateFormat.i18n;
var masken = DateFormat.masks;
// Sie können UTC nicht angeben, wenn Sie andere Argumente überspringen (verwenden Sie das Präfix "UTC:" Mask).
// Wenn es nur einen Parameter gibt, ist dieser Parameter eine Zeichenfolge, die keine Zahlen enthält, die als Maske angesehen werden. Das Datum wird im nächsten wenn zum neuen Datum generiert, also ist das Datum das aktuelle Datum.
If (argumes.length == 1 && object.prototype.toString.call (Datum) == "[Objektstring]" &&! // d /test (Datum)) {
Maske = Datum;
Datum = undefiniert;
}
// Datum drei Aplies Datum.Parse gegebenenfalls
Datum = Datum?
if (isnan (Datum)) syntaxError werfen ("ungültiges Datum");
// Es ist klar, welche Maske in vielen Fällen beurteilt wird, egal wie zuvor angegeben. Achten Sie auf die Fähigkeiten von ||.
Mask = string (masken [mask] || mask || masken ["Standard"]);
// Das Einstellen des UTC -Arguments über die Maske zulassen
if (mask.slice (0, 4) == "utc:") {{{{{{{{{{
mask = mask.lice (4);
Utc = true;
}
// Zwei Fälle, verwenden Sie die Situation und die allgemeine im UTC -Format. Beachten Sie, dass die wörtlichen Indizes von JS auch zu Mitgliedern der Methode zurückkehren können.
var_ = utc?
d = Datum [_ + "Datum"] ,,,
D = Datum [_ + "Tag"] () ,,
M = Datum [_ + "Monat"] () ,,
y = Datum [_ + "vollständig"] (),
H = Datum [_ + "Halten"] () ,,,
M = Datum [_ + "Minuten"] (),
S = Datum [_ + "Sekunden"] () ,,,
L = Datum [_ + "Millisekunden"] () ,,
O = UTC?
Flags = {
D: D,
DD: Pad (d),
DDD: i18n.daynames [d],
DDDD: I18N.DayNames [D + 7], // Bit Breite: 7, siehe DateFormat.DayNames.
M: M + 1, // ab 0
mm: pad (m + 1) ,,
mmm: i18n.montHnames [m],
mmmm: i18n.montHnames [M + 12], // Bitbreite: 12, siehe DateFormat.montHhnames
Yy: String (y) .Slice (2), // String Slice () Verwendung
yjyy: y,
H: H % 12 || 12, // H bedeutet 12 Stunden, h teilt 12 (weil Duoden) und das Ergebnis des Restes 12 Stunden beträgt.
HH: PAD (H % 12 || 12),
H: H,
HH: Pad (h),
M: M,
Mm: pad (m),
S: S,
SS: Pads (s),
L: PAD (L, 3), // Max, 999ms
L: PAD (l> 99? Math.Round (l / 10): l),
// Einfluss bevormunden
T: H <12? "A": "P",
TT: H <12? "Am": "PM",
T: H <12? "A": "P",
TT: H <12? "Am": "PM",
// Suchen Sie in diesem Schritt Timezone, befassen Sie sich einfach damit.
// Der vorherige Artikel ist TimeZone, TimeZoneclip =/[^-+/da-z]/g,
// String Die Zeichenfolgeform des Rückgabedatums, einschließlich eines langen ... UTC ... Informationen
// Wenn nicht, [""] .pop () gibt das leere Zeichen zurück
Z: UTC? ")," ")," ")," ")," ")," "),"), ")," ")," ")"), ""), "") , "" "
// 4 -bit TimeZoneOffset
O: (o> 0? "-": " +") + pad (math.floor (math.abs (o) / 60) * 100 + math.abs (o) % 60, 4),
// finde in englischer Sprache ["Th", "st", "nd", "rd"] nach den einzelnen Ziffern von D.
S: ["Th", "St", "Nd", "Rd"] [d % 10> 3?
};
Return mask.replace (Token, Funktion ($ 0 /* ist gut $ 0, Beachten Sie $ 1, $ 2 nach dem besetzten System* /) {) {) {) {) {) {) {) {) {) { ) {)
// Wie erkennst du die angegebenen Attribute für ein bestimmtes Objekt? Erfasse es einfach!
// $ 0.slice (1, $ 0.länge -1); was bedeutet das?
$ 0 in Flags zurückgeben?
});
};
}) ();
Der Code gilt als umfassend über die Datumsverarbeitung. Daher geben wir das Prinzip ein, um sein Geheimnis zu sehen, wie es mit dem Datum umgehen!
In der Vorlage für Datumszeichenfolge haben wir uns bereit erklärt, aussagekräftige Symbole von Yyjyy/mm/dd usw. zu verwenden. Achten Sie auf Distinguished. Kurz gesagt, dies ist eine standardisierte Vereinbarung, dh die sogenannte "Maske" des oben genannten Code. Wenn Sie das Datum der Analyse betrifft, erhalten Sie zunächst nach den gesamten Anforderungen der Maske jedes Element jedes Datums eins nach dem anderen (getDate (), getMinute ()) ... Sie können es bald bekommen) und dann dem Realen folgen Maskenbedingungen, dh die Maske der .replace -Methode (regulär, Element), um die String -Vorlage und das Element zu ersetzen, und der Ersatzprozess ist immer noch eine Vergleichstabelle, die mit dem Flag übereinstimmt. Was den regulären Teil betrifft, so ist der Schlüssel der Prozess des Verständnisses des Tokens und der Funktion ersetzen (). Nehmen Sie an den obigen Code -Kommentaren teil, um die internen Details zu verstehen.
Ist es nicht anstrengend, jedes Mal die langwierige Maskenzeichenfolge zu betreten? Wir können unsere Arbeitsbelastung reduzieren, indem wir konstante Methoden definieren:
Kopieren Sie den Code -Code wie folgt:
DateFormat.masks = {
"Standard": "ddd mmm dd yyyy hh: mm: ss",
Shortdate: "M/d/yy",
Shortdate2: "yy/m/d/h: mm: ss" ,,
MediumDate: "Mmm D, Yjyy",
Longdate: "Mmmm D, Yjyy",
Fulldate: "dddd, mmmm d, jyyy",
Kurzzeit: "H: MM TT",
Mittelzeit: "H: MM: SS TT",
langjährig: "H: MM: SS TT Z",
Isodat: "Yyjy-MM-DD",
Isotime: "HH: MM: SS",
Isodatetime: "yyyy-mm-dd't't't't't't'hh: mm: ss",
Isoutcdatetime: "utc: yyyyy-mm-dd't't't't't't't'hh: mm: ss'z '"
// Fügen Sie das Datum von China @edit 2010.8.11 hinzu
, Chinesetate: 'Yyyy Year Mm Monat DD Day HH Time MM Points' '
}
DateFormat.i18n = {
DayNames: [[
"Sonne", "Mon", "Di", "Mi", "Thu", "Fr.", "Sat",
"Sunday", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"
] ,,,,
Monatsnamen: [[
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
"Januar", "Februar", "März", "April", "May", "June", "Juli", "August", "September", "Oktober", "November", "Dezember"
]
};
Steves DateFormat reicht aus, um die Aufgabe der meisten Date -Konvertierung zu erledigen, aber im riesigen Code haben wir eine bessere Lösung ohne die 20 Codezeilen gefunden, und die reguläre Verwendung ist kostenlos, dh JS vom Senior of the Moon Schatten!
Kopieren Sie den Code -Code wie folgt:
Datum.Prototype.format = Funktion (Format) // Autor: MEIZZ
{{{{
var o = {
"M+": this.getMonth () +1, // Monat
"D+": this.getDate (), // Tag
"H+": this.gethours (), // stunde
"M+": this.getminutes (), // Minute
"S+": this.getSeconds (), // Sekunde
"q+": math.floor ((this.getMonth ())+3), // Quarter
"S": this.getMilliseconds () // Millisekunden
}
if (/(y+)/. test (format)) format = format.replace (regexp. $ 1,
(this.getingfully ()+"").
für (var k in o) if (neuer regexp ("(" " + k +"). Test (Format))
Format = format.replace (regexp. $ 1,
Regexp.
("00"+ o [k]).
Rückgabeformat;
}
Alert (neues Datum (). Format ("yyyy-mm-dd hh: mm: ss");
Das Prinzip ähnelt der Steve -Methode, aber der konzentrierte Code integriert Fähigkeiten und Vollständigkeit. Ausgehend von der 12. Quellzeile kann die Test () -Methode nicht nur die Mindestfunktion der Übereinstimmung erkennen, sondern auch die Speicheranpassungsergebnisse. Verwenden Sie dann neue Regexp, um eine Instanz des regulären Ausdrucks in Form einer Zeichenfolge zu erstellen, und es ist ein cleverer Ort, da er direkt mit der Hash -Tabelle direkt mit O verbunden ist! Nach dem Gesetz wird das Kürbis zuerst auf die Übereinstimmung des Lebens getestet und ersetzen es, falls einige, es ersetzen.
Zusätzlich ist das ("00" + o [k]). Der ursprüngliche Zweck war es, die letzten beiden Array zu nehmen. Dies ist eine Fähigkeit, die die Substr () -Methode umfassend verwendet. Infolgedessen, wie viele Ziffern wir im Voraus hinzugefügt haben, und die ursprüngliche Länge der festen Zeichenfolge ist unverändert (o [k] .Length), wie viele Ziffern übrig waren. (PS "00" entspricht einem Platzierungssymbol und kann auch mit anderen Zeichenfolge "xx" anstelle keiner Unterschied verwendet werden)
Haben Sie immer noch das Gefühl, dass dieser Code viele Schwierigkeiten hat? Wir haben versucht, die Funktion des Mondschattens als starke Lesbarkeit neu zu schreiben. Der Code von Yueying.
Kopieren Sie den Code -Code wie folgt:
Datum = {
Format: Funktion (Datum, Format) {
Datum = neues Datum (Datum);
Datum = {
Jahr: Datum.Getinging ()
, Monat: Datum.GetMonth () + 1 // Monat, der Monat beginnt bei Null
, Tag: Date.getDate ()
, Stunde: Datum.Gethours () ())
, Minute: Date.getminutes ()
, Zweitens: Datum.getSeconds ()
, Milute: Date.getMillisekunden ()
};
Var
übereinstimmen
Reg = /y+) | (y+) |
While ((match = reg.exec (format))! = Null) {
Match = Match [0];
if (/y/i.test (Match)) {
Format = format.replace (Match, Datum.YEAR);
}
if (match.indexof ('m')! = -1) {
Format = format.replace (Match, Datum.month);
}
if (match.indexof ('d')! = -1) {
Format = format.replace (Match, Datum.Day);
}
if (match.indexof ('h')! = -1) {
Format = format.replace (Match, Datum.Hour);
}
if (match.indexof ('m')! = -1) {
Format = format.replace (Match, Datum.minute);
}
if (match.indexof ('s')! = -1) {
Format = format.replace (Match, Datum.Second);
}
if (match.indexof ('u')! = -1) {
Format = format.replace (Match, Datum.milute);
}
}
Rückgabeformat;
}
};
2011--1-7:
Wie kann ich die Zeichenfolge an das JS -Standarddatum umwandeln? Sehen Sie, wie das neue EXT erledigt ist?
Kopieren Sie den Code -Code wie folgt:
/**
* Nach dem spezifischen Formatdatum.
* Analysieren Sie einen Wert, der einen formatierten Datumsbenutzer analysiert, mit dem angegebenen Formatmuster.
* @param {String/Datum} Wert zur Formatierung (Die Zeichenfolge muss die Formatanforderungen des JavaScript -Datumsobjekts erfüllen, siehe <a href = "http://www.w3schools.com/jsref/jsref_parser.asp" mce_Href = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = "http://www.w.w3schools.com/jsref/jsref_parse.asp"> parse () </a>) Der Wert für Format (Zeichenfolgen müssen dem vom JavaScribrift erwarteten Format entsprechen
* Datum des Objekts <a href = "http://www.w3schools.com/jsref/jsref_parse.asp" mce_href = "http://www.w3schools.com/jsref_parse.asp" (Parse ") </a> methody method )
* @param {String} Format (optional) Formatierungsstring. (Optional) (optional) Eine gültige Datumsformatzeichenfolge (Standardeinstellungen zu 'm/d/y'))
* @Return {String} hat die Zeichenfolge formatiert. Die formatierte Datumszeichenfolge
*/
Datum: Funktion (v, Format) {
if (! v) {{{{{{{
Zurückkehren "" ";
}
if (! ext.isdate (v)) {
v = neues Datum (Datum.Pars (v));
}
Return v.DateFormat (Format || ext.util.format.DefaultDateFormat);
}
Kann der Datumskonstruktor auch das Datum bestimmen, indem die Anzahl der Millisekunden ab 1970 berechnet wird? —— IP, das ist in Ordnung, das ist aus der Perspektive dieses Problems die Einheit mit dem kleinsten JS -Datum Millisekunden.
Endversion:
Kopieren Sie den Code -Code wie folgt:
/**
* Datumsformatierung. Weitere Informationen finden Sie im Blog -Beitrag: http://blog.csdn.net/zhangxin09/archive/2011/01/6111294.aspx
* EG: Neues Datum ().
* @param {String} Format
* @Return {String}
*/
Datum.Prototype.Format = Funktion (Format) {
var $ 1, o = {
"M +": this.getMonth () + 1, // Monat, starten Sie mit 0
"D+": this.getDate (), // Datum
"H+": this.gethours (), // Stunden
"M+": this.getminutes (), // Minuten
"S+": this.getSeconds (), // Sekunden
// Quate Viertel
"Q +": math.floor ((this.getMonth () + 3) / 3),
"S": this.getMilliseconds () // Tausende von Sekunden
};
var key, Wert;
if (//y+)/.test (Format)) {{{{{
$ 1 = Regexp.
Format = format.replace ($ 1, String (this.getingfullyear ()). Substr (4 -$ 1));
}
Für (Schlüssel in o) {// Wenn der Parameter nicht angegeben ist, wird der Sub -String bis zum Ende von StringVar fortgesetzt.
if (neuer regexp ("(" + taste + ")"). test (format) {
$ 1 = Regexp.
Value = String (o [Schlüssel]),
Wert = $ 1.Length == 1?
Format = format.replace ($ 1, Wert);
}
}
Rückgabeformat;
}