Una de nuestras prácticas más comunes para la expansión de JavaScript es la expansión de la fecha. Prototipo. Porque sabemos que la clase de fecha solo proporciona varios métodos para obtener elementos de fecha, como getDate (), getMinute () ... pero ninguno de los métodos de formato convertidos en cadena específica. Por lo tanto, use estos métodos sutiles para encapsular y combinar el formulario de cadena de fecha que queremos. En términos generales, esta función de formatización se puede definir en el prototipo del objeto de fecha, o se puede escribir de forma independiente. La operación del prototipo de definición es como date.prototype.format = function (date) {...}, y directamente nueva date (). . Sin embargo, el método de prototipo de definición se sospecha ligeramente de la falta de prototipo JS de "invasión". Este problema debe considerarse al diseñar API. Mi sugerencia es que los usuarios toman decisiones de acuerdo con su propio juicio, pero el método de llamada es diferente, y la lógica del proceso no afecta el proceso.
El siguiente ejemplo es la función de formato de la fecha de JavaScript escrita por funciones independientes, una función de formato independiente. Volviendo a este punto de conocimiento de formato, examinamos cómo y qué principios se usaron. Aunque las costuras tradicionales como el indexOf ()+substr () se pueden lograr, obviamente no solo es de baja eficiencia, sino que el código es largo para introducir expresiones regulares primero. Luego coincida con los resultados de los resultados. Primero veamos ejemplos de Steven Levithan:
Copiar código del código de la siguiente manera:
/**
* Formato de fecha 1.2.3
* @Credit Steven Levithan <Stevenlevithan.com> Incluye mejoras de Scott Trenda <Scott.trenda.net> y Kris Kowal <Cixar.com/~kris.kowal/>
* Acepta una fecha, un maestro o una fecha y un maestro.
* Devuelve una versión formateada de la fecha dada.
* La fecha predeterminada es la fecha/hora actual.
* La máscara predeterminada a DateFormat.
*/
dateFormat = (function () {
// Notas regulares, 1. Token, (? :) Indique el grupo de no captura;/1 referencia inversa (piense: {1,2} ¿Puede significar lo mismo que/1?); Aquí, significa que en el soporte es simple coincidir con cualquier personaje, pero no se entiende por el momento/L | o citas individuales).
Varto = D {1,4} | /gramo,
// 2. Zonera, [PMCEA] [SDP] genera el consumo de dos caracteres;
TimeZone = // b (?: [PMCEA] [SDP] T | (? -+]/d {4})?)/b/g,
Timezoneclip =/[^-+/da-z]/g,
// en carácter de llenado de menos de dos bits, o el número de posicionamiento se puede colocar
pad = function (valor, len) {
valor = string (val);
Len = Len || 2;
While (val.length <len) val = "0" + valor;
Valor de retorno;
};
// Por qué devuelve una función, porque las variables explicadas anteriormente se han vuelto constantes, y los parámetros que se devuelven a continuación son la función del tiempo real. Esto se implementa cerrando la escritura. Como comentarios en inglés, puedes acelerar.
// Las reglas y las funciones de apoyo se almacenan en caché a través del cierre
// Descripción del parámetro: Fecha: fecha o nueva fecha;
Función de retorno (fecha, máscara, utc) {
var i18n = dateFormat.i18n;
Var máscaras = dateFormat.Masks;
// No puede proporcionar UTC si omite otros args (use el prefijo "UTC:" de máscara)
// Si solo hay un parámetro, este parámetro es una cadena que no contiene números, que se considera como una máscara. La fecha se genera mediante una nueva fecha en la siguiente si, por lo tanto, la fecha es la fecha actual.
If (argumes.length == 1 && object.prototype.tostring.call (date) == "[String de objeto]" &&! // d /test (date)) {
máscara = fecha;
fecha = indefinido;
}
// Fecha de aprobación de tres aplicaciones Fecha.
fecha = fecha?
if (isnan (date)) tire sintaxError ("fecha inválida");
// Está claro qué es la máscara al juzgar en muchos casos, sin importar cómo se especifique anteriormente. Presta atención a las habilidades de ||.
Mask = String (Masks [Mask] || Mask || Masks ["predeterminado"]);
// Permitir configurar el argumento UTC a través de la máscara
if (mask.slice (0, 4) == "utc:") {{
Mask = Mask.Slice (4);
Utc = true;
}
// Dos casos, use la situación y el general en formato UTC. Tenga en cuenta que los índices literal de JS también pueden volver a los miembros del método.
var_ = utc?
d = fecha [_ + "fecha"] ,,,
D = fecha [_ + "día"] () ,,
m = fecha [_ + "mes"] () ,,
y = date [_ + "totalmentear"] (),
H = fecha [_ + "retener"] () ,,,
M = fecha [_ + "minutos"] (),
s = fecha [_ + "segundos"] () ,,,
L = fecha [_ + "milisegundos"] () ,,
O = UTC?
Banderas = {
D: D,
DD: almohadilla (d),
DDD: i18n.daynames [D],
dddd: i18n.daynames [d + 7], // Ancho de bit: 7, ver dateFormat.dayNames.
M: m + 1, // comenzando desde 0
mm: almohadilla (m + 1) ,,
mmm: i18n.monthnames [m],
mmmm: i18n.MonthNames [M + 12], // Ancho de bit: 12, ver dateFormat.MonthNames
Yy: string (y) .slice (2), // String slice () Uso
Yyyy: Y,
H: H % 12 || 12, // H significa 12 horas, H divide 12 (porque duodes), y el resultado del resto es de 12 horas.
HH: almohadilla (H % 12 || 12),
S.S,
HH: almohadilla (H),
M: M,
Mm: almohadilla (m),
S: S,
SS: almohadilla (s),
L: pad (l, 3), // max, 999ms
L: almohadilla (l> 99? Math.round (l / 10): l),
// Influencia patrocinada
T: H <12?
TT: H <12?
T: H <12?
TT: H <12?
// busca la zona horaria en este paso, solo lidia con eso.
// El artículo anterior es TimeZone, TimeZoneclip =/[^-+/Da-Z]/G,
// Cadena el formulario de cadena de la fecha de retorno, incluida una información larga ... UTC ...
// si no, [""] .pop () Devuelve el carácter vacío
Z: UTC? ")," "),"), ""), ")," "),"), ""), ")," "),"), ")," ") , ""
// 4 bitszoneOffset
o: (o> 0? "-": " +") + pad (math.floor (math.abs (o) / 60) * 100 + math.abs (o) % 60, 4),
// encontrar en inglés ["th", "st", "nd", "rd"], de acuerdo con los dígitos únicos de D
S: ["th", "st", "nd", "rd"] [d % 10> 3?
};
Return mask.replace (token, function ($ 0 /* es bueno $ 0, aviso $ 1, $ 2 por el sistema ocupado* /) {) {) {) {) {) {) {) {) {) {) ) {)
// ¿Cómo detectar los atributos especificados en un determinado objeto? ¡Solo detectarlo!
// $ 0.Slice (1, $ 0. Length -1);?
Devolver $ 0 en banderas?
});
};
}) ();
El código se considera completo sobre el procesamiento de la fecha, por lo que ingresamos el principio para ver su misterio, ¡cómo lidiar con la fecha!
En la plantilla de cadenas de fechas, acordamos usar símbolos significativos de aaa yyy/mm/dd, etc., respectivamente indicar un cierto elemento en la fecha, como y, es un año, mes, mes si está en mayúsculas, también debe Presta atención a Distinguido. En resumen, este es un acuerdo estandarizado, es decir, la "máscara" de SO del código anterior. En cuanto a la fecha del análisis, primero de acuerdo con los requisitos completos de la máscara, obtenga cada elemento de cada fecha uno por uno (getDate (), getMinute ()) ... puede obtenerlo pronto), y luego siga el real Condiciones de máscara, es decir, enmascarar el método .Replace (regular, elemento) para reemplazar la plantilla de cadena y el elemento, y el proceso de reemplazo sigue siendo una tabla de comparación que coincide con la bandera por bandera. En cuanto a la parte regular, la clave es el proceso de comprender el token y la función reemplazar (). Participe en los comentarios del código anterior para comprender los detalles internos.
¿No es agotador ingresar a la larga cadena de máscara cada vez? Podemos reducir nuestra carga de trabajo definiendo métodos constantes:
Copiar código del código de la siguiente manera:
dateFormat.Masks = {
"Predeterminado": "ddd mmm dd yyyy hh: mm: ss",
Shortdate: "m/d/yy",
shortdate2: "yy/m/d/h: mm: ss" ,,
Media Fedate: "Mmm D, aa yyy",
Longdate: "mmmm d, aa yyy",
FulLDate: "DDDD, Mmmm D, aaa yyy",
Tiempo corto: "H: MM TT",
Medio: "H: MM: SS TT",
desde hace mucho tiempo: "H: MM: SS TT Z",
Isodate: "aaa yyy-mm-dd",
Isotime: "HH: MM: SS",
Isodatetime: "yyyy-mm-dd't't't't't't'hh: mm: ss",
IsoutcdateTime: "Utc: aayyyy-mm-dd't't't't't't'hhh: mm: ss'z '"
// Agregar la fecha de China @Edit 2010.8.11
, Chinesetate: 'YYYY AÑO MM MES DD DÍA HH TIME MM PUNTOS'
}
dateFormat.i18n = {
Names de día: [[
"Sol", "Mon", "martes", "casado", "thu", "viernes", "sentado",
"Domingo", "lunes", "martes", "miércoles", "jueves", "viernes", "sábado"
] ,,,
Names mensuales: [[
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "sep", "oct", "nov", "dec", "
"Enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"
]
};
DateFormat de Steve es suficiente para completar la tarea de la mayoría de la conversión de fechas, pero en el vasto código, hemos encontrado una mejor solución, sin las 20 líneas de código, y el uso regular es gratuito, es decir, JS de Senior of the Moon ¡sombra!
Copiar código del código de la siguiente manera:
Date.prototype.format = function (format) // Autor: Meizz
{{
var o = {
"M+": this.getMonth () +1, // mes
"D+": this.getDate (), // Day
"H+": this.gethours (), // hora
"M+": this.getminutes (), // minuto
"S+": this.getSeconds (), // segundo
"Q+": Math.floor ((this.getMonth ())+3), // trimestre
"S": this.getMilliseConds () // milisegundo
}
if (/(y+)/. test (format)) format = format.replace (regexp. $ 1,
(this.gettylyear ()+"").
para (var k en o) if (nuevo regexp ("(" " + k +"). Test (formato)))
Format = format.replace (regexp. $ 1,
REGEXP.
("00"+ o [k]).
Formato de retorno;
}
alerta (nueva fecha (). Formato ("A yyyy-MM-DD HH: MM: SS");
El principio es similar al método Steve, pero el código más concentrado integra las habilidades y la amplitud. A partir de la 12ª línea de código fuente, el método Test () no solo puede detectar la función mínima de la coincidencia, sino que también hay resultados de coincidencia de memoria. Luego, use nuevo Regexp para crear una instancia de expresión regular en forma de una cadena, y es un lugar inteligente, porque está directamente conectado con la tabla hash directamente con O! Luego, según la ley, la calabaza se prueba para la coincidencia de la vida primero, y si es algo, reemplácela.
Además, el ("00" + O [k]). El propósito original era tomar los últimos dos de la matriz. Esta es una habilidad que utiliza exhaustivamente el método substr (). Como resultado, cuántos dígitos agregamos por adelantado, y la longitud de la cadena fija original no cambia (o [k] .gentil), entonces cuántos dígitos quedaban. (PS "00" es equivalente a un símbolo de colocación, y también se puede usar con otra cadena "xx" en lugar de sin diferencia)
¿Todavía sientes que este código tiene muchas dificultades? Intentamos reescribir la función de la sombra de la luna como una fuerte legibilidad. El código de Yueying.
Copiar código del código de la siguiente manera:
fecha = {
Format: función (fecha, formato) {
fecha = nueva fecha (fecha);
fecha = {
Año: date.gettylyear ()
, Mes: date.getmonth () + 1 // mes, el mes comienza desde cero
, Día: date.getDate ()
, Hora: date.gethours () ()
, Minuto: date.getminutes ()
, Segundo: date.getSeconds ()
, Milute: date.getMilliseConds ()
};
Varilla
fósforo
, Reg = (y+)
While ((match = reg.exec (format))! = Null) {
Match = Match [0];
if (/y/i.test (match)) {
Formato = formato
}
if (match.indexof ('m')! = -1) {
Format = format.replace (coincidencia, fecha.month);
}
if (match.indexof ('d')! = -1) {
Format = format.replace (coincidir, fecha.day);
}
if (match.indexof ('h')! = -1) {
Format = format.replace (coincidencia, date.hur);
}
if (match.indexof ('m')! = -1) {
Format = format.replace (coincidencia, date.minute);
}
if (match.indexof ('s')! = -1) {
Format = format.replace (Match, date.second);
}
if (match.indexof ('u')! = -1) {
Format = format.replace (coincidencia, date.milute);
}
}
Formato de retorno;
}
};
2011-1-7:
¿Cómo puedo convertir la cadena en la fecha estándar JS? ¿Ves cómo se hace el nuevo ext?
Copiar código del código de la siguiente manera:
/**
* De acuerdo con la fecha de formato de formato específico.
* Analice un valor insto un usuario de fecha formateado utilizando el patrón de formato especificado.
* @param {string/date} valor para formatear (la cadena debe cumplir con los requisitos de formato del objeto JavaScript Date, consulte <a href = "http://www.w3schools.com/jsref/jsref_parser.asp" mce_href = = = = = = = = "http://www.w.w3schools.com/jsref/jsref_parse.asp"> parse () </a>) el valor para formatear (las cadenas deben cumplir con el formato esperado por Javascrift
* Date Object's <a href = "http://www.w3schools.com/jsref/jsref_parse.asp" mce_href = "http://www.w3schools.com/jsref_parse.asp" (parse ") </a> método )
* @param {String} Format (Opcional) Formato de formato cadena. (Opcional) (Opcional) Cualquier cadena de formato de fecha válida (predeterminada a 'M/D/Y')
* @Return {string} ha formateado la cadena. La cadena de fecha formateada
*/
Fecha: función (v, formato) {
if (! V) {{
Devolver "" ";
}
if (! ext.isdate (v)) {
v = nueva fecha (fecha.pars (v));
}
Return v.DateFormat (formato || ext.util.format.defaultDateFormat);
}
¿Puede el constructor de fecha también determinar la fecha calculando el número de milisegundos de 1970? —— ip, esto está bien, es decir, de la otra manera, desde la perspectiva de este problema, la unidad con la fecha JS más pequeña es milisegundos.
Versión final:
Copiar código del código de la siguiente manera:
/**
* Formateo de la fecha. Para más detalles, consulte la publicación del blog: http://blog.csdn.net/zhangxin09/archive/2011/01/6111294.aspx
* Por ejemplo: nueva fecha ().
* @param {string} formato
* @Return {string}
*/
Date.prototype.format = function (format) {
var $ 1, o = {
"M +": this.getMonth () + 1, // mes, comience desde 0
"D+": this.getDate (), // fecha
"H+": this.gethours (), // horas
"M+": this.getminutes (), // minutos
"S+": this.getSeconds (), // segundos
// Quate Quarter
"Q +": Math.floor ((this.getMonth () + 3) / 3),
"S": this.getMilliseConds () // miles de segundos
};
clave var, valor;
if (//y+)/.test (format)) {{
$ 1 = regexp.
Format = formato
}
Para (clave en o) {// Si no se especifica el parámetro, la subcondeza continuará hasta el final de StringVar.
if (new Regexp ("(" + Key + ")"). Test (Format) {
$ 1 = regexp.
Valor = string (o [clave]),
valor = $ 1.length == 1?
Format = format.replace ($ 1, valor);
}
}
Formato de retorno;
}