Salah satu praktik kami yang lebih umum untuk ekspansi JavaScript adalah perluasan tanggal.prototype. Karena kita tahu bahwa kelas tanggal hanya menyediakan beberapa metode untuk mendapatkan elemen tanggal, seperti getDate (), getMinute () ... tetapi tidak ada metode pemformatan yang dikonversi ke string tertentu. Oleh karena itu, gunakan metode halus ini untuk merangkum dan menggabungkan bentuk string tanggal yang kami inginkan. Secara umum, fungsi format ini dapat didefinisikan pada prototipe objek tanggal, atau dapat ditulis secara mandiri. Pengoperasian prototipe definisi adalah seperti date.prototype.format = function (date) {...}, dan tanggal baru (). . Namun, metode prototipe definisi sedikit dicurigai karena kurangnya prototipe "invasi" JS. Masalah ini harus dipertimbangkan saat merancang API. Saran saya adalah bahwa pengguna membuat keputusan sesuai dengan penilaian mereka sendiri, tetapi metode panggilan berbeda, dan logika proses tidak mempengaruhi proses.
Contoh berikut adalah fungsi pemformatan tanggal JavaScript yang ditulis oleh fungsi independen, fungsi format independen. Kembali ke titik pemformatan pengetahuan ini, kami memeriksa bagaimana dan prinsip apa yang digunakan. Meskipun jahitan string tradisional seperti indexOf ()+substr () dapat dicapai, itu jelas tidak hanya efisiensi rendah, tetapi juga kodenya panjangnya. kemudian cocokkan hasil hasil. Mari kita lihat contoh -contoh dari Steven Levithan:
Salin kode kode sebagai berikut:
/**
* Format tanggal 1.2.3
* @Credit Steven Levithan <stevenlevithan.com> Termasuk peningkatan oleh Scott Trenda <scott.trenda.net> dan Kris Kowal <cixar.com/~kris.kowal/>
* Menerima tanggal, master, atau kencan dan master.
* Mengembalikan versi yang diformat dari tanggal yang diberikan.
* Tanggal default ke tanggal/waktu saat ini.
* Topeng default ke DateFormat.
*/
dateFormat = (function () {
// Catatan Reguler, 1. Token, (? Di sini berarti dalam braket, mudah untuk mencocokkan karakter apa pun, tetapi tidak dipahami untuk saat ini/L | atau kutipan tunggal).
Vartoken = D {1,4} | /G,
// 2. TimeZone, [PMCEA] [SDP] menghasilkan konsumsi dua karakter;
TimeZone = // B (?: [PMCEA] [SDP] T | (?: Pacific | Mountain | Central | Timur | Atlantic) (?: Standar | Daylight | berlaku) Waktu | (?: GMT | UTC) (? [ -+]/d {4})?)/b/g,
TimeZoneClip =/[^-+/da-z]/g,
// dalam kurang dari dua karakter pengisian -bit, atau jumlah penentuan posisi dapat diposisikan
pad = function (value, len) {
nilai = string (val);
len = len ||
While (val.length <len) val = "0" + nilai;
Nilai pengembalian;
};
// Mengapa mengembalikan suatu fungsi, karena variabel yang dijelaskan sebelumnya telah menjadi konstan, dan parameter yang dikembalikan di bawah ini adalah fungsi dari waktu nyata. Ini diimplementasikan dengan menutup tulisan. Sebagai komentar dalam bahasa Inggris, Anda dapat mempercepat.
// Regexes dan fungsi pendukung di -cache melalui penutupan
// Deskripsi Parameter: Tanggal: Tanggal: Tanggal baru;
Fungsi pengembalian (tanggal, topeng, utc) {
var i18n = dateFormat.i18n;
var masker = dateFormat.masks;
// Anda tidak dapat memberikan UTC jika Anda melewatkan arg lain (gunakan "UTC:" awalan topeng)
// Jika hanya ada satu parameter, parameter ini adalah string yang tidak mengandung angka, yang dianggap sebagai topeng. Tanggal dihasilkan pada tanggal baru di IF berikutnya, jadi tanggal adalah tanggal saat ini.
If (argumes.length == 1 && object.prototype.toString.call (date) == "[Object String]" &&! // d /test (date)) {
topeng = tanggal;
tanggal = tidak ditentukan;
}
// tanggal lewat tiga aplies tanggal.parse, jika perlu
Tanggal = Tanggal? Tanggal baru): Tanggal baru;
if (isnan (tanggal)) lempar sintakserror ("Tanggal tidak valid");
// Jelas apa topeng itu dengan menilai dalam banyak kasus, tidak peduli seberapa ditentukan sebelumnya. Perhatikan keterampilan ||.
Mask = string (masker [mask] || mask || masker ["default"]);
// Izinkan pengaturan argumen UTC melalui topeng
if (mask.slice (0, 4) == "utc:") {{{{{{{{{{{{{{
mask = mask.slice (4);
UTC = true;
}
// Dua kasus, gunakan situasi dan umum dalam format UTC. Perhatikan bahwa indeks literal JS juga dapat kembali ke anggota metode.
var_ = UTC? "GetUtc": "Get",
D = Tanggal [_ + "Tanggal"] ,,,
D = tanggal [_ + "hari"] () ,,
m = tanggal [_ + "bulan"] () ,,
y = Tanggal [_ + "Fullear"] (),
H = tanggal [_ + "hold"] () ,,,
M = tanggal [_ + "menit"] (),
s = tanggal [_ + "detik"] () ,,,
L = tanggal [_ + "milidetik"] () ,,
O = UTC?
Flags = {
D: D,
DD: pad (d),
DDD: i18n.daynames [D],
dddd: i18n.daynames [d + 7], // bit lebar: 7, lihat dateFormat.daynames.
M: m + 1, // mulai dari 0
mm: pad (m + 1) ,,
mmm: i18n.monthnames [m],
mmmm: i18n.monthnames [m + 12], // bit lebar: 12, lihat dateFormat.monthnames
Yy: string (y) .slice (2), // string slice () penggunaan
yyyy: y,
H: H % 12 || 12, // H berarti 12 jam, h membagi 12 (karena duodes), dan hasil sisanya adalah 12 jam.
HH: PAD (H % 12 || 12),
H: h,
HH: pad (h),
M: M,
Mm: pad (m),
S: S,
SS: PAD,
L: Pad (L, 3), // Max, 999ms
L: PAD (L> 99? Math.round (L / 10): L),
// Menggambar pengaruh
T: H <12? "A": "P",
TT: h <12?
T: H <12? "A": "P",
TT: h <12?
// Cari zona waktu pada langkah ini, atasi saja.
// Artikel sebelumnya adalah TimeZone, TimeZoneClip =/[^-+/da-z]/g,
// String bentuk string dari tanggal pengembalian, termasuk ... UTC ... informasi
// jika tidak, [""] .pop () mengembalikan karakter kosong
Z: UTC? ")," ")," ")," ")," ")," ")," ")," ")," ")," ")," ")," ")," ") , ""
// 4 -bit timezoneoffset
o: (o> 0? "-": " +") + pad (math.floor (math.abs (o) / 60) * 100 + math.abs (o) % 60, 4),
// temukan dalam bahasa Inggris ["th", "st", "nd", "rd"], menurut satu digit d
S: ["th", "st", "nd", "rd"] [d % 10> 3?
};
Return mask.replace (token, function ($ 0 /* bagus $ 0, pemberitahuan $ 1, $ 2 oleh sistem yang ditempati* /) {) {) {) {) {) {) {) {) {) { ) {)
// Bagaimana cara mendeteksi atribut yang ditentukan pada objek tertentu? Deteksi saja!
// $ 0.slice (1, $ 0. Length -1);?
Mengembalikan $ 0 dalam bendera?
});
};
}) ();
Kode ini dianggap komprehensif tentang pemrosesan tanggal, jadi kami memasukkan prinsip untuk melihat misteri, -bagaimana menangani tanggal!
In the date strings template, we agreed to use meaningful symbols of yyyy/mm/dd, etc., respectively indicate a certain element in the date, like Y, that is a year, Month, Month If you are uppercase, you should also Perhatikan dibedakan. Singkatnya, ini adalah perjanjian standar, yaitu, "topeng" yang disebut dari kode di atas. Adapun tanggal analisis, pertama sesuai dengan seluruh persyaratan topeng, dapatkan setiap elemen dari setiap tanggal satu per satu (getDate (), getminute ()) ... Anda bisa segera mendapatkannya), dan kemudian ikuti yang asli Kondisi topeng, yaitu topeng. Replace (reguler, elemen) untuk mengganti templat string dan elemen, dan proses penggantian masih merupakan tabel perbandingan yang cocok dengan bendera dengan bendera. Adapun bagian reguler, kuncinya adalah proses memahami token dan fungsi ganti (). Berpartisipasi dalam komentar kode di atas untuk memahami detail internal.
Bukankah melelahkan untuk memasukkan string topeng panjang setiap saat? Kita dapat mengurangi beban kerja kita dengan mendefinisikan metode konstan:
Salin kode kode sebagai berikut:
dateFormat.masks = {
"Default": "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",
Shorttime: "H: MM TT",
Menengah: "h: mm: ss tt",
lama: "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: "UTC: yyyyy-mm-dd't't't't't'hh: mm: ss'z '"
// Tambahkan tanggal China @Edit 2010.8.11
, Chinesetate: 'yyyy tahun mm bulan dd hari hh waktu poin mm'
}
dateFormat.i18n = {
Daynames: [[
"Sun", "mon", "tue", "wed", "thu", "fri", "Sat",
"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"
] ,,,
Monthnames: [[
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
"Januari", "Februari", "March", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"
]
};
Tanggal Steve sudah cukup untuk menyelesaikan tugas sebagian besar konversi tanggal, tetapi dalam kode yang luas, kami telah menemukan solusi yang lebih baik, tanpa 20 baris kode, dan penggunaan rutin gratis, yaitu JS dari senior bulan bulan bayangan!
Salin kode kode sebagai berikut:
Date.prototype.format = function (format) // penulis: Meizz
{{
var o = {
"M+": this.getMonth () +1, // bulan
"D+": this.getDate (), // day
"H+": this.getHours (), // jam
"M+": this.getMinutes (), // menit
"S+": this.getSeconds (), // kedua
"q+": math.floor ((this.getmonth ())+3), // kuartal
"S": this.getMilliseconds () // milidetik
}
if (/(y+)/. test (format)) format = format.replace (regexp. $ 1,
(this.getlyear ()+"").
untuk (var k dalam o) if (regexp baru ("(" " + k +"). Tes (format))
Format = format.replace (regexp. $ 1,
Regexp.
("00"+ o [k]).
Format pengembalian;
}
peringatan (tanggal baru (). Format ("yyyy-mm-dd hh: mm: ss");
Prinsipnya mirip dengan metode Steve, tetapi kode yang lebih terkonsentrasi mengintegrasikan keterampilan dan kelengkapan. Mulai dari baris kode sumber ke -12, metode test () tidak hanya dapat mendeteksi fungsi minimum pencocokan, tetapi juga ada hasil pencocokan memori. Kemudian, gunakan RegExp baru untuk membuat instance ekspresi reguler dalam bentuk string, dan itu adalah tempat yang pintar, karena secara langsung terhubung dengan tabel hash secara langsung dengan O! Kemudian, menurut hukum, labu diuji untuk pencocokan kehidupan terlebih dahulu, dan jika beberapa, menggantinya.
Selain itu, ("00" + o [k]). Tujuan aslinya adalah untuk mengambil dua array terakhir. Ini adalah keterampilan yang secara komprehensif menggunakan metode Substr (). Akibatnya, berapa banyak digit yang kami tambahkan terlebih dahulu, dan panjang string tetap asli tidak berubah (o [k] .length), lalu berapa banyak digit yang tersisa. (PS "00" setara dengan simbol penempatan, dan juga dapat digunakan dengan string lain "xx", bukannya tidak ada perbedaan)
Apakah Anda masih merasa bahwa kode ini memiliki banyak kesulitan? Kami mencoba untuk menulis ulang fungsi Moon Shadow sebagai keterbacaan yang kuat. Kode yueying.
Salin kode kode sebagai berikut:
Tanggal = {
Format: function (tanggal, format) {
Tanggal = Tanggal Baru (Tanggal); // Force Con.
Tanggal = {
tahun: date.getlear ()
, Bulan: date.getmonth () + 1 // bulan, bulan dimulai dari nol
, Day: Date.getDate ()
, Jam: date.getHours () ()
, Menit: date.getMinutes ()
, Kedua: date.getSeconds ()
, Skilut: Date.getMilliseconds ()
};
Var
cocok
, Reg = (Y+) |
While ((match = reg.exec (format))! = Null) {
cocok = cocok [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);
}
}
Format pengembalian;
}
};
2011--1-7:
Bagaimana cara mengubah string ke tanggal standar JS? Lihat bagaimana ext baru dilakukan?
Salin kode kode sebagai berikut:
/**
* Menurut tanggal pemformatan format tertentu.
* Parse nilai insto pengguna tanggal yang diformat menggunakan pola format yang ditentukan.
* @param {string/date} nilai untuk format (string harus memenuhi persyaratan format objek tanggal javascript, lihat <a href = "http://www.w3schools.com/jsref/jsref_parser.asp" mce_href = = = = = "http://www.w.w3schools.com/jsref/jsref_parse.asp"> parse () </a>) Nilai untuk format (string harus sesuai dengan format yang diharapkan oleh JavaScrift yang ditimbulkan
* Tanggal objek <a href = "http://www.w3schools.com/jsref/jsref_parse.asp" mce_href = "http://www.w3schools.com/jsref_parse.asp" (parse ") </a> )
* @param {string} format (opsional) format format string. (Opsional) (Opsional) Setiap string format tanggal yang valid (default ke 'm/d/y')
* @Return {string} telah memformat string. String tanggal yang diformat
*/
Tanggal: function (v, format) {
if (! v) {{
Kembali "" ";
}
if (! ext.isdate (v)) {
v = Tanggal baru (date.pars (v));
}
Return v.DateFormat (format || ext.util.format.defaultDateFormat);
}
Dapatkah Konstruktor Tanggal juga menentukan tanggal dengan menghitung jumlah milidetik dari tahun 1970? — -IP, ini OK, -yaitu, dengan cara lain, dari perspektif masalah ini, unit dengan tanggal JS terkecil adalah milidetik.
Versi Final:
Salin kode kode sebagai berikut:
/**
* Pemformatan tanggal. Untuk detailnya, lihat posting blog: http://blog.csdn.net/zhangxin09/archive/2011/01/6111294.aspx
* EG: Tanggal baru ().
* @param {string} format
* @Return {string}
*/
Date.prototype.format = function (format) {
var $ 1, o = {
"M +": this.getmonth () + 1, // bulan, mulai dari 0
"D+": this.getDate (), // tanggal
"H+": this.getHours (), // jam
"M+": this.getMinutes (), // menit
"S+": this.getSeconds (), // detik
// quate quarter
"Q +": math.floor ((this.getmonth () + 3) / 3),
"S": this.getMilliseconds () // ribuan detik
};
var Key, nilai;
if (//y+)/.test (format)) {{
$ 1 = Regexp.
Format = format.replace ($ 1, string (this.getlyear ()). Substr (4 -$ 1));
}
Untuk (tombol dalam o) {// Jika parameter tidak ditentukan, sub -string akan berlanjut ke ujung StringVar.
if (regexp baru ("(" + key + ")"). test (format) {
$ 1 = Regexp.
Value = string (o [key]),
nilai = $ 1.length == 1?
Format = format.replace ($ 1, nilai);
}
}
Format pengembalian;
}