Одной из наших наиболее распространенных практик для расширения JavaScript является расширение даты. Прототип. Поскольку мы знаем, что класс даты предоставляет только несколько методов получения элементов даты, таких как getDate (), getMinute () ... но ни один из методов форматирования не преобразован в конкретную строку. Поэтому используйте эти тонкие методы для инкапсуляции и объединения нужной формы строки даты. Вообще говоря, эта функция форматизации может быть определена на прототипе объекта даты, или она может быть написана независимо. Операция прототипа определения такая, как Date.prototype.format = function (date) {...} и непосредственно New Date (). Полем Тем не менее, метод прототипа определения немного подозревается в отсутствии прототипа «вторжения» JS. Эта проблема должна быть рассмотрена при разработке API. Я предполагаю, что пользователи принимают решения в соответствии со своим собственным суждением, но метод вызова отличается, и логика процесса не влияет на процесс.
Следующим примером является функция форматирования даты JavaScript, записанной независимыми функциями, независимой функцией формата. Вернувшись к этой точке знаний форматирования, мы изучили, как и какие принципы использовались. Хотя традиционная строчка, такой как indexof ()+substr (), может быть достигнута, это, очевидно, не только низкая, но и код является длинным. Затем сопоставьте результаты результатов. Давайте сначала посмотрим на примеры от Стивена Левитана:
Код кода копирования следующим образом:
/**
* Формат даты 1.2.3
* @credit Steven Levithan <Steenlevithan.com> Включает улучшения Scott Trenda <scott.trenda.net> и Kris Kowal <cixar.com/~kris.kowal/>
* Принимает дату, мастер или дату и мастер.
* Верните форматированную версию данной даты.
* Дата по умолчанию в текущую дату/время.
* Маска по умолчанию на сегодняшний день.
*/
dateFormat = (function () {
// Регулярные примечания, 1. Токен, (? :) Укажите не -зачетную группу;/1 обратная ссылка (подумайте: {1,2} Это означает то же самое, что/1?); Здесь это означает, что в скобке это просто, но это не понимает, что это не так. или одиночные кавычки).
vartoken = d {1,4} | /g,
// 2. Timezone, [PMCEA] [SDP] генерирует потребление двух символов;
Timezone = // b (? -+]/d {4})?)/b/g,
Timezoneclip =/[^-+/da-z]/g,
// в менее двух -билевом наполненном символе, или количество позиционирования может быть расположено
pad = function (value, len) {
value = string (val);
Лен = Лен || 2;
While (val.length <len) val = "0" + value;
Возвращаемое значение;
};
// Почему возвращает функцию, потому что переменные, объясненные ранее, стали постоянными, а параметры, возвращаемые ниже, являются функцией реального времени. Это реализовано путем закрытия письма. Как комментарии на английском, вы можете ускорить.
// регулярные выражения и вспомогательные функции кэшируются через закрытие
// Описание параметров: Дата: Дата или новая дата;
Функция возврата (Date, Mask, UTC) {
var i18n = dateformat.i18n;
var macks = dateformat.masks;
// Вы не можете предоставить UTC, если вы пропустите другие аргументы (используйте «UTC:» Mask Prefix)
// Если есть только один параметр, этот параметр представляет собой строку, которая не содержит чисел, которая рассматривается как маска. Дата сгенерирована новой датой в следующей, если, так что дата - текущая дата.
If (argumes.length == 1 && object.prototype.tostring.call (date) == "[объект строки]" &&! // d /test (date)) {
Маска = дата;
дата = не определен;
}
// дата прохождения три приоритета дата.parse, при необходимости
дата = дата?
if (isnan (date)) throw syntaxError («неверная дата»);
// Понятно, что такое Маска, оценивая во многих случаях, независимо от того, как ранее это указало. Обратите внимание на навыки ||.
Маска = Строка (Маски [Маска] || Маска || Маски ["по умолчанию"]);
// разрешить настройку аргумента UTC через маску
if (mask.slice (0, 4) == "utc:") {{{
Маска = Маска.SLICE (4);
Utc = true;
}
// два случая, используйте ситуацию и общий в формате UTC. Обратите внимание, что буквальные индексы JS также могут вернуться к членам метода.
var_ = utc?
d = дата [_ + "дата"] ,,,
D = date [_ + "day"] () ,,
m = date [_ + "месяц"] () ,,
y = date [_ + "Folloar"] (),
H = date [_ + "hold"] () ,,,
M = date [_ + "минуты"] (),
s = date [_ + "секунды"] () ,,,
L = date [_ + "миллисекунд"] () ,,
O = utc?
Flags = {
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],
Мммм: i18n.monthNames [M + 12], // бит ширина: 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),
М: М,
ММ: Pad (M),
SS,
SS: Pad (S),
L: Pad (L, 3), // макс, 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,
// строка строковой формы даты возврата, включая длинную ... 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"], согласно единственным цифрам D
S: ["Th", "ST", "ND", "Rd"] [D % 10> 3?
};
Return mask.replace (token, function ($ 0 /* - это хорошо $ 0, уведомление $ 1, $ 2, засеченная система* /) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) {) ) {)
// Как обнаружить указанные атрибуты на определенном объекте? Просто обнаружите это!
// $ 0.slice (1, $ 0length -1);?
Вернуть $ 0 в флагах?
});
};
}) ();
Код считается исчерпывающим в отношении обработки даты, поэтому мы вводим принцип, чтобы увидеть его загадку, -как иметь дело с датой!
В шаблоне строк даты мы согласились использовать значимые символы yyyy/mm/dd и т. Д., Соответственно, указать определенный элемент в дату, например, y, это год, месяц, месяц, если вы находитесь в проведении, вы также должны также Обратите внимание на отличие. Короче говоря, это стандартизированное соглашение, то есть SO -обозначенная «маска» приведенного выше кода. Что касается даты анализа, сначала в соответствии со всеми требованиями маски, получите каждый элемент каждой даты один за другим (getDate (), getMinute ()) ... вы можете получить его скоро), а затем следуйте реальным Условия маски, то есть замаскировать метод .Replace (обычный, элемент) для замены шаблона строки и элемента, а процесс замены по -прежнему остается таблицей сравнения, которая соответствует флагу по флага. Что касается обычной части, ключом является процесс понимания токена и функции reply (). Участвуйте в приведенных выше комментариях кода, чтобы понять внутренние детали.
Разве это не утомительно входить в длинную строку маски каждый раз? Мы можем уменьшить нашу рабочую нагрузку, определив постоянные методы:
Код кода копирования следующим образом:
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",
MediumTime: "H: MM: SS TT",
давний: "H: MM: SS TT Z",
Изодат: "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'hhh: mm: ss'z '"
// Добавить дату Китая @edit 2010.8.11
, Chinesetate: «Yyyy Year Mm Month DD Day HH Time MM Points '
}
dateformat.i18n = {
дневные имени: [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
«Солнце», «Мон», «Вт», «Ср», «Чт», «Пт», «Сб»,
«Воскресенье», «Понедельник», «Вторник», «Среда», «Четверг», «Пятница», «Суббота»
] ,,,
Месячные имена: [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
«Ян», «Февраль», «Мар», «Апр», «Мэй», «Джун», «Джул», «Авг», «Сеп», «Окт», «Новый», «Дек»,
«Январь», «февраль», «март», «апрель», «май», «июнь», «июль», «Август», «Сентябрь», «Октябрь», «Ноябрь», «Декабрь»
]
};
DateFormat Стива достаточно для выполнения задачи большинства конверсии дат тень!
Код кода копирования следующим образом:
Date.prototype.format = function (format) // Автор: meizz
{{
var o = {
"M+": this.getMonth () +1, // месяц
"D+": this.getDate (), // день
"H+": this.gethours (), // час
"M+": this.getMinutes (), // минута
"S+": this.getSeconds (), // секунд
"q+": math.floor ((this.getmonth ())+3), // квартал
"S": this.getMilliseconds () // миллисекунд
}
if (/(y+)/. test (format)) format = format.replace (regexp. $ 1,
(this.getiflyear ()+"").
для (var k in o) if (new regexp ("(" " + k +"). test (format))
Format = format.replace (regexp. $ 1,
Regexp.
("00"+ o [k]).
Возврат формат;
}
Alert (New Date (). Format ("yyyy-mm-dd HH: MM: SS");
Принцип аналогичен методу Стива, но более концентрированный код интегрирует навыки и полноценность. Начиная с 12 -й строки исходного кода, метод Test () может не только обнаружить минимальную функцию сопоставления, но и на самом деле есть результаты сопоставления памяти. Затем используйте новый режим regexp, чтобы создать экземпляр регулярного выражения в виде строки, и это умное место, потому что он напрямую связан с хэш -таблицей непосредственно с O! Затем, согласно закону, тыква проверяется на подбор жизни сначала, а если некоторые, замените ее.
Кроме того, ("00" + O [K]). Первоначальная цель состояла в том, чтобы взять последние два из массива. Это навык, который всесторонне использует метод substr (). В результате, сколько цифр мы добавили заранее, и исходная фиксированная длина строки остается неизменной (o [k] .length), то сколько цифр осталось. (PS "00" эквивалентен символу размещения, и его также можно использовать с другой строкой "xx" вместо отсутствия разницы)
Вы все еще чувствуете, что у этого кода много трудностей? Мы пытались переписать функцию лунной тени как сильную читаемость. Кодекс юэрирования.
Код кода копирования следующим образом:
date = {
Формат: функция (дата, формат) {
Дата = новая дата (дата);
date = {
Год: date.getiflyear ()
, Месяц: date.getmonth () + 1 // месяц, месяц начинается с нуля
, День: date.getDate ()
, Час: date.gethours () ()
, Минута: date.getminutes ()
, Второе: date.getSeconds ()
, Milute: date.getmilliseconds ()
};
Вар
соответствовать
, 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? Видите, как сделан новый экстен?
Код кода копирования следующим образом:
/**
* В соответствии с конкретной датой форматирования формата.
* Проанализируйте значение, внедряющее форматированную дату пользователя, используя указанный шаблон формата.
* @param {string/date} значение для форматирования (строка должна соответствовать требованиям формата объекта Date Date Javascript, см. <a href = "http://www.w3schools.com/jsref/jsref_parser.asp" mce_href = = = "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> Метод )
* @param {string} format (необязательный) Строка формата формата. (Необязательно) (Необязательно) Любая допустимая строка формата даты (по умолчанию «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 Key, значение;
if (//y+)/.test (format)) {{{
$ 1 = regexp.
Format = format.replace ($ 1, string (this.getfulear ()). Substr (4 -$ 1));
}
Для (ключа в o) {// Если параметр не указан, суб -строение будет продолжаться до конца stringVar.
if (new regexp ("(" + key + ")"). test (format) {
$ 1 = regexp.
Value = string (o [key]),
значение = $ 1.length == 1?
Format = format.replace ($ 1, значение);
}
}
Возврат формат;
}