2010-05-31 17 views
10

tengo una fecha en este formato: dd.mm.aaaaCómo crear una nueva fecha() en Javascript desde un formato de fecha no estándar

Cuando instanciar una fecha JavaScript con él, me da una NaN

En C# Puedo especificar un formato de fecha, por ejemplo: aquí tienes mi cadena, está en este formato, por favor haz una fecha y hora de la misma.

¿Es esto posible en JavaScript también? Si no, ¿hay una manera fácil?

Preferiría no utilizar una subcadena por día, subcadena por mes, etc. porque mi método también debe tener las fechas en alemán, italiano, inglés, etc.

Respuesta

23

Usted tendrá que crear una función para extraer las partes de la fecha y utilizarlos con el Date constructor.

Tenga en cuenta que este constructor trata los meses como números basados ​​en cero (0=Jan, 1=Feb, ..., 11=Dec).

Por ejemplo:

function parseDate(input) { 
    var parts = input.match(/(\d+)/g); 
    // note parts[1]-1 
    return new Date(parts[2], parts[1]-1, parts[0]); 
} 

parseDate('31.05.2010'); 
// Mon May 31 2010 00:00:00 

Editar: Para el manejo de un de formato variable se podría hacer algo como esto:

function parseDate(input, format) { 
    format = format || 'yyyy-mm-dd'; // default format 
    var parts = input.match(/(\d+)/g), 
     i = 0, fmt = {}; 
    // extract date-part indexes from the format 
    format.replace(/(yyyy|dd|mm)/g, function(part) { fmt[part] = i++; }); 

    return new Date(parts[fmt['yyyy']], parts[fmt['mm']]-1, parts[fmt['dd']]); 
} 

parseDate('05.31.2010', 'mm.dd.yyyy'); 
parseDate('31.05.2010', 'dd.mm.yyyy'); 
parseDate('2010-05-31'); 

La función anterior acepta un parámetro formato, que debe incluir los marcadores de posición yyyymm y dd, los separadores no son realmente importantes, ya que solo los dígitos son capturados por RegExp.

También puede dar un vistazo a DateJS, una pequeña biblioteca que hace que la fecha de análisis indoloro ...

+1

me gustaría procesar el mm/dd/aaaa y dd/mm/aaaa también – Michel

+0

@Michel eche un vistazo a mi edición. – CMS

+0

¡Excelente! ¡Funciona de maravilla! Odio aunque no tengo ni idea de cómo funciona :) – Michel

7

No existe una forma integrada de manipular las fechas de la manera que a usted le gustaría.

El jQuery-UI datepicker tiene la funcionalidad que desea, estoy seguro de que muchas otras bibliotecas tienen algo similar.

$.datepicker.parseDate('dd.mm.yy', '31.12.2007'); 
+1

sí, esto es algo que quiero, pero sin toda la lib datepicker si es posible. Así que me gustaría una de esas 'otras bibliotecas' :-) – Michel

+1

@Michel echa un vistazo a "datejs", que es usado por jQuery UI datepicker – Pointy

+0

@Pointy - perfecto, solo estaba encontrando lo mismo – Ryley

8

Es bastante fácil de dividir la cadena en una matriz y pasar las partes directamente al objeto Fecha:

var str = "01.01.2010"; 
var dmy = str.split("."); 

var d = new Date(dmy[2], dmy[1] - 1, dmy[0]); 
+3

El parámetro de mes de Date() toma Month in Zero based index. Enero = 0, febrero = 1, marzo = 2 ... etc – Warty

+0

@ItzWarty: sí, también lo recordé, gracias :-) –

1
t="01.01.1970" 
parts = t.split("."); 
for(var i = 0; i < parts.length; i++) parts[i] = parseInt(parts[i], 10); 
new Date(parts[2], parts[1]-1, parts[0]); 

Fecha definida como (año, mes, día)
Fecha() 's parámetro meses lleva meses en el índice basado en cero. Enero = 0, febrero = 1, marzo = 2 ... etc

No es necesario analizar la cadena a un int, pero no me gusta pasar cadenas a las funciones y solo espero que JavaScript lo "obtenga" ... Algo así como algunas personas prefieren ===

+1

'parseInt' no debería ser obligatorio (la escritura de JavaScript es dinámica y las cadenas deberían ser automáticamente lanzar a un número) y el bucle es un poco OTT para una operación tan simple. –

+1

Lo que @Andy dice es que el constructor 'Date' [explícitamente] (http://bclary.com/2004/11/07/#a-15.9.3.1) convertirá los argumentos internamente [' ToNumber'] (http: //bclary.com/2004/11/07/#a-9.3). Además, usar 'parseInt' sin el argumento radix, es especialmente dañino aquí, ya que puede tener una fecha como' "09.09.2010" ', y' parseInt ('09 ') == 0', ya que el cero anterior forzará la conversión de números como base octal, y esto no ocurre con la operación interna 'ToNumber'. – CMS

+0

Buen punto, CMS. – Warty

Cuestiones relacionadas