واحدة من ممارساتنا الأكثر شيوعًا لتوسيع جافا سكريبت هي توسيع النمط. نظرًا لأننا نعلم أن فئة التاريخ توفر فقط عدة طرق للحصول على عناصر التاريخ ، مثل getDate () ، getMinute () ... ولكن لا توجد من طرق التنسيق التي تم تحويلها إلى سلسلة محددة. لذلك ، استخدم هذه الطرق الدقيقة لتغليف نموذج سلسلة التاريخ الذي نريده. بشكل عام ، يمكن تعريف وظيفة التنسيق هذه على النموذج الأولي لكائن التاريخ ، أو يمكن كتابتها بشكل مستقل. يتم تشغيل النموذج الأولي للتعريف. . ومع ذلك ، فإن طريقة التعريف النموذجية يشتبه قليلاً في عدم وجود نموذج أولي "الغزو". يجب النظر في هذه المشكلة عند تصميم API. اقتراحي هو أن المستخدمين يتخذون القرارات وفقًا لحكمهم ، لكن طريقة الاتصال مختلفة ، وأن منطق العملية لا يؤثر على العملية.
المثال التالي هو وظيفة التنسيق لتاريخ JavaScript المكتوبة بواسطة وظائف مستقلة ، وهي وظيفة تنسيق مستقلة. بالعودة إلى نقطة المعرفة هذه للتنسيق ، درسنا كيف تم استخدام المبادئ وما هي المبادئ. على الرغم من أنه يمكن تحقيق خياطة السلسلة التقليدية مثل indexof () substr () ، فمن الواضح أنه لا يقتصر الأمر على الكفاءة ، ولكنه لا يزال الوقت مناسبًا لإدخال التعبيرات العادية. ثم تطابق نتائج النتائج. دعونا نلقي نظرة أولاً على أمثلة من ستيفن ليفيثان:
نسخ رمز رمز على النحو التالي:
/**
* تنسيق التاريخ 1.2.3
* Credit Steven Levithan <Stevenlevithan.com> يتضمن تحسينات من Scott Trenda <scott.trenda.net> و Kris Kowal <cixar.com/~kris.kowal/>
* يقبل موعدًا أو سيدًا أو موعدًا و Master.
* إرجاع نسخة منسقة من التاريخ المحدد.
* التاريخ الافتراضي إلى التاريخ/الوقت الحالي.
* القناع الافتراضيات حتى DateFormat.
*/
DateFormat = (function () {
// ملاحظات منتظمة ، 1. الرمز المميز ، (: :) تشير إلى مجموعة غير عكسية ؛/1 مرجع عكسي (فكر: {1،2} هل يعني ذلك مثل/1؟) ؛ هنا يعني في القوس أن تتطابق مع أي شخصية ، ولكن لا يتم فهمها في الوقت الحالي. أو اقتباسات واحدة).
Vartoken = /d {1،4} | /ز ،
// 2. المنطقة الزمنية ، [PMCEA] [SDP] يولد استهلاك حرفين ؛
TimeZone = // B (؟: [PMCEA] [SDP] T | (؟: Pacific | Mountain | Central | Eastern | Atlantic) (؟: Standard | Daylight | Prevailing) Time | (؟: GMT | UTC) (؟ [؟ -+]/d {4})؟)/b/g ،
timezoneclip =/[^-+/da-z]/g ،
// في أقل من طابع ملء اثنين ، أو يمكن وضع عدد المواقع
pad = function (value ، len) {
القيمة = السلسلة (val) ؛
لين = لين || 2 ؛
بينما (Val.Length <len) val = "0" + value ؛
قيمة الإرجاع
} ؛
// لماذا إرجاع وظيفة ، لأن المتغيرات الموضحة سابقًا أصبحت ثابتة ، والمعلمات التي تم إرجاعها أدناه هي وظيفة الوقت الحقيقي. يتم تنفيذ هذا عن طريق إغلاق الكتابة. كتعليقات باللغة الإنجليزية ، يمكنك تسريع.
// يتم التخزين المؤقت لـ regexes والوظائف الداعمة من خلال الإغلاق
// الوصف: التاريخ: تاريخ أو تاريخ جديد ؛
وظيفة الإرجاع (التاريخ ، القناع ، UTC) {
var i18n = dateformat.i18n ؛
VAR أقنعة = DateFormat.masks ؛
// لا يمكنك توفير UTC إذا تخطيت args الأخرى (استخدم "UTC:" Premix)
// إذا كانت هناك معلمة واحدة فقط ، فإن هذه المعلمة عبارة عن سلسلة لا تحتوي على أرقام ، والتي تعتبر قناعًا. يتم إنشاء التاريخ حسب تاريخ جديد في اليوم التالي ، لذلك التاريخ هو التاريخ الحالي.
if (argumes.length == 1 && object.prototype.toString.call (date) == "
قناع = تاريخ ؛
التاريخ = غير محدد ؛
}
// تمريرة تاريخ ثلاثة تاريخ. parse ، إذا لزم الأمر
التاريخ = التاريخ الجديد (التاريخ): تاريخ جديد ؛
إذا (isnan (date)) رمي بناء الجملة ("تاريخ غير صالح") ؛
// من الواضح ما هو القناع من خلال الحكم في كثير من الحالات ، بغض النظر عن مدى تحديده مسبقًا. انتبه إلى مهارات ||.
Mask = String (Mask [Mask] || Mask || Mask ["Default"]) ؛
// اسمح بتعيين وسيطة UTC عبر القناع
if (mask.slice (0 ، 4) == "UTC:") {{
قناع = Mask.slice (4) ؛
UTC = صحيح ؛
}
// حالتان ، استخدموا الموقف والجمهور في تنسيق UTC. لاحظ أن الفهارس الحرفية لـ JS يمكنها أيضًا العودة إلى أعضاء الطريقة.
var_ = UTC؟
D = التاريخ [_ + "التاريخ"] ،،،
D = Date [_ + "Day"] () ،،
M = التاريخ [_ + "شهر"] () ،،
y = Date [_ + "smoleear"] () ،
H = التاريخ [_ + "Hold"] () ،،،
م = التاريخ [_ + "الدقائق"] () ،
S = التاريخ [_ + "Seconds"] () ،،،
l = date [_ + "milliseconds"] () ،،
O = UTC؟
أعلام = {
D: D ،
DD: PAD (D) ،
DDD: i18n.daynames [d] ،
DDDD: i18n.daynames [D + 7] ، // Bit Width: 7 ، انظر DateFormat.DayNames.
M: M + 1 ، // بدءًا من 0
MM: PAD (M + 1) ،،
MMM: I18N.MonthNames [M] ،
MMMM: I18N.MonthNames [M + 12] ، // Bit Width: 12 ، انظر DateFormat.MonthNames
yy: string (y) .slice (2) ، // string slice ()
Yyyy: Y ،
H: H ٪ 12 || 12 ، // H يعني 12 ساعة ، H يقسم 12 (لأن الثنائيات) ، ونتيجة الباقي 12 ساعة.
HH: PAD (H ٪ 12 || 12) ،
H: H ،
HH: PAD (H) ،
مم،
MM: PAD (M) ،
S: S ،
SS: PAD (S) ،
L: Pad (L ، 3) ، // Max ، 999ms
L: PAD (L> 99؟ Math.Round (L / 10): L) ،
// رعاية التأثير
T: H <12؟
TT: H <12؟
T: H <12؟
TT: H <12؟
// اطلب من المنطقة الزمنية في هذه الخطوة ، فقط تعامل معها.
// المقالة السابقة هي timezone ، timezoneclip =/[^-+/da-z]/g ،
// string نموذج السلسلة من تاريخ الإرجاع ، بما في ذلك معلومات طويلة ... UTC ...
// إذا لم يكن الأمر كذلك ، [""] .pop () أعد الحرف الفارغ
Z: UTC؟ ") ،" ") ،" ") ،" ") ،" ") ،" ") ،" ") ،" ") ،" ") ،" ") ،" ") ،") ، "") ، ") ، ""
// 4 -bit timezoneoffset
o: (o> 0؟
// Find in English ["TH" ، "ST" ، "ND" ، "RD"] ، وفقًا لأرقام d
S: ["Th" ، "ST" ، "ND" ، "RD"] [D ٪ 10> 3؟
} ؛
إرجاع mask.replace (token ، function ($ 0 /* هو جيد $ 0 ، إشعار $ 1 ، $ 2 بواسطة النظام المشغل* /) {) {) {) {) {) {) {) {) {) {) { ) {)
// كيفية اكتشاف السمات المحددة على كائن معين؟ فقط اكتشفها!
// $ 0.SLICE (1 ، $ 0.LENGTH -1) ؛ ماذا يعني ذلك؟
إرجاع $ 0 في أعلام؟
}) ؛
} ؛
}) () ؛
يعتبر الرمز شاملًا حول معالجة التاريخ ، لذلك ندخل المبدأ لرؤية لغزه ، كيف يتعاملون مع التاريخ!
في قالب سلاسل التاريخ ، اتفقنا على استخدام رموز ذات مغزى من Yyyy/Mm/DD ، وما إلى ذلك ، على التوالي ، تشير إلى عنصر معين في التاريخ ، مثل Y ، أي سنة ، شهر ، شهر إذا كنت أحرفًا كبيرة ، يجب عليك أيضًا انتبه إلى التمييز. باختصار ، هذا اتفاق موحد ، أي "القناع" الذي تم تحريكه من الكود أعلاه. بالنسبة لتاريخ التحليل ، أولاً وفقًا لمتطلبات القناع بأكملها ، احصل على كل عنصر من عناصر كل تاريخ واحد تلو الآخر (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-dd't't't't'hh: mm: ss" ،
isoutcdatetime:
// أضف تاريخ الصين @Edit 2010.8.11
، chinesetate: 'Yyyy Yey Mm Month Dd Day Hh Time Mm Points'
}
DateFormat.i18n = {
أسماء DayNames: [[
"Sun" ، "Mon" ، "Tue" ، "Wed" ، "Thu" ، "Fri" ، "Sat" ،
"الأحد" ، "الاثنين" ، "الثلاثاء" ، "الأربعاء" ، "الخميس" ، "الجمعة" ، "السبت"
] ،،،
أسماء الشهر: [[
"Jan" ، "Feb" ، "Mar" ، "Apr" ، "May" ، "Jun" ، "Jul" ، "Aug" ، "Sep" ، "Oct" ، "Nov" ، "Dec" ،
"يناير" ، "فبراير" ، "مارس" ، "أبريل" ، "مايو" ، "يونيو" ، "يوليو" ، "أغسطس" ، "سبتمبر" ، "أكتوبر" ، "نوفمبر" ، "ديسمبر"
]
} ؛
يعد DateFormat من Steve كافية لإكمال مهمة تحويل التاريخ ، ولكن في الرمز الشاسع ، وجدنا حلاً أفضل ، بدون 20 سطرًا من التعليمات البرمجية ، والاستخدام المنتظم مجاني ، أي JS من كبار القمر ظل!
نسخ رمز رمز على النحو التالي:
date.prototype.format = دالة (تنسيق) // المؤلف: Meizz
{{
var o = {
"M+": this.getmonth () +1 ، // month
"D+": this.getDate () ، // day
"H+": this.gethours () ، // ساعة
"M+": this.getMinutes () ، // دقيقة
"S+": this.getSeconds () ، // الثانية
"Q+": Math.Floor ((this.getmonth ())+3) ، // Quarter
"S": this.getmilliseconds () // millisecond
}
إذا (/(y+)/. اختبار (تنسيق)) تنسيق = format.replace (regexp. $ 1 ،
(this.getlyear ()+"").
لـ (var k in o) if (regexp جديد ("(" " + k +"). اختبار (تنسيق))
format = format.replace (regexp. $ 1 ،
regexp.
("00"+ o [k]).
تنسيق العودة
}
تنبيه (تاريخ جديد ().
يشبه المبدأ طريقة Steve ، ولكن الكود الأكثر تركيزًا يدمج المهارات والشمولية. بدءًا من السطر الثاني عشر من التعليمات البرمجية ، لا يمكن أن تكتشف طريقة Test () الحد الأدنى للمطابقة ، ولكن في الواقع هناك نتائج مطابقة للذاكرة. بعد ذلك ، استخدم regexp جديد لإنشاء مثيل للتعبير العادي في شكل سلسلة ، وهو مكان ذكي ، لأنه متصل مباشرة بجدول التجزئة مباشرة مع O! ثم ، وفقًا للقانون ، يتم اختبار القرع لمطابقة الحياة أولاً ، وإذا كان البعض يحل محله.
بالإضافة إلى ذلك ، ("00" + O [K]). كان الغرض الأصلي هو أخذ آخر اثنين من المصفوفة. هذه هي المهارة التي تستخدم بشكل شامل طريقة Substr (). نتيجة لذلك ، كم عدد الأرقام التي أضفناها مسبقًا ، وطول السلسلة الثابتة الأصلي لم يتغير (O [K]. الطول) ، ثم عدد الأرقام المتبقية. (PS "00" يعادل رمز التنسيب ، ويمكن أيضًا استخدامه مع سلسلة أخرى "XX" بدلاً من عدم وجود فرق)
هل ما زلت تشعر أن هذا الرمز لديه الكثير من الصعوبات؟ حاولنا إعادة كتابة وظيفة ظل القمر باعتبارها قابلية للقراءة القوية. رمز Yueying.
نسخ رمز رمز على النحو التالي:
التاريخ = {
التنسيق: الوظيفة (التاريخ ، التنسيق) {
التاريخ = تاريخ جديد (التاريخ) ؛
التاريخ = {
السنة: date.getlyiar ()
، الشهر: date.getmonth () + 1 // month ، يبدأ الشهر من الصفر
، اليوم: date.getDate ()
، الساعة: Date.gethours () ()
، دقيقة: Date.getMinutes ()
ثانياً: Date.getSeconds ()
، Milute: Date.getMilliseconds ()
} ؛
var
مباراة
، reg = /y+) (y+)
بينما ((match = reg.exec (تنسيق))! = 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 القياسي؟ انظر كيف يتم الانتهاء من تحويلة جديدة؟
نسخ رمز رمز على النحو التالي:
/**
* وفقًا لتاريخ التنسيق المحدد.
* تحليل قيمة مستخدم تاريخ تنسيق باستخدام نمط التنسيق المحدد.
* param {string/date} القيمة للتنسيق (يجب أن تلبي السلسلة متطلبات التنسيق لكائن تاريخ JavaScript ، انظر <a href = "http://www.w3schools.com "http://www.w.w3schools.com/jsref/jsref_parse.asp"> parse () </a>) القيمة للتنسيق (يجب أن تتوافق الأوتار مع التنسيق المتوقع بواسطة javascrift
* كائن التاريخ <a href = "http://www.w3schools.com/jsref/jsref_parse.asp" mce_href = "http://www.w3schools.com/jsref_parse.asp" (parse ") </a> method )
* param {string} تنسيق (اختياري) تنسيق سلسلة تنسيق. (اختياري) (اختياري) أي سلسلة تنسيق تاريخ صالحة (الافتراضيات إلى 'm/d/y')
* @regurn {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}
* @regurn {string}
*/
date.prototype.format = function (format) {
var $ 1 ، o = {
"M +": this.getmonth () + 1 ، // month ، ابدأ من 0
"D+": this.getDate () ، // التاريخ
"H+": this.gethours () ، // ساعات
"M+": this.getMinutes () ، // دقائق
"S+": this.getSeconds () ، // Seconds
// 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)) ؛
}
لـ (المفتاح في O) {// إذا لم يتم تحديد المعلمة ، فستستمر المُثن الفرعي حتى نهاية StringVar.
if (new regexp ("(" + key + ")"). اختبار (تنسيق) {
$ 1 = regexp.
value = string (o [key]) ،
القيمة = $ length == 1؟
Format = format.replace ($ 1 ، القيمة) ؛
}
}
تنسيق العودة
}