Convierta la cadena dd-mm-aaaa a la fecha


184

Estoy tratando de convertir una cadena en el formato dd-mm-aaaa en un objeto de fecha en JavaScript usando lo siguiente:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val()contiene una fecha en el formato dd-mm-aaaa. Cuando hago lo siguiente, aparece la "Fecha inválida":

alert(f);

¿Esto se debe al símbolo '-'? ¿Cómo puedo superar esto?


¿Esto sucede con todas las fechas o una en particular?
kasdega

Respuestas:


326

Dividido en "-"

Analiza la cuerda en las partes que necesitas:

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Usar expresiones regulares

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

¿Por qué no usar regex?

Porque sabes que trabajarás en una cadena compuesta de tres partes, separadas por guiones.

Sin embargo, si estaba buscando esa misma cadena dentro de otra cadena, la expresión regular sería el camino a seguir.

Reutilizar

Debido a que está haciendo esto más de una vez en su código de muestra, y tal vez en otra parte de su base de código, envuélvalo en una función:

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

Utilizando como:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

O si no te importa jQuery en tu función:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

Utilizando como:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

JavaScript moderno

Si puede utilizar JS más modernos, la desestructuración de matrices también es un buen toque:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

9
me ganó ... pero todavía uso DateJs. Esto no es exactamente correcto debido a un error de publicación de valla. el mes es 0-11, por lo que debe restar 1. f = nueva Fecha (de [2], de [1] -1, de [0]);
kasdega

12
Respuesta seleccionada con un error que produce fechas incorrectas. ¡Increíble!
epascarello

3
Cheers @kasdega - Lo edité ... hace un tiempo!
Adrian Lynch

@AdrianLynch ¿Cómo convertir "Mes dd, aaaa" en "MM / dd / aaaa" en javascript?
dilipkumar1007

1
¡La opción de JavaScript @Adrian Lynch Modern es genial! Gracias.
Alexandre Ribeiro

134

ejemplo de expresión regular:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

8
Una revisión que también toma /es delimitador y un año compuesto de 2 dígitos (o cualquier conteo mayor que 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki

1
¿Por qué debería ser esta la respuesta seleccionada @AdemirNuno? ¿Por qué usar RegEx para una cadena en un formato conocido? No estás buscando un patrón, sabes que el primer número es el día, el segundo el mes y el tercero el año. RegEx es la herramienta incorrecta para el trabajo en este caso.
Adrian Lynch

Una revisión que toma delimitadores sin dígitos, fechas sin ceros a la izquierda y años de 2 o 4 dígitos: new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") ); en.wikipedia.org/wiki/Date_format_by_country
PaulH

es tan práctica chico, gracias. mi formato de fecha viene con la hora, así que lo recodifico como: 'nueva Fecha ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' ¿Es correcto?
Kamuran Sönecek

@NeerajSingh ¿Cómo convertir "Mes dd, aaaa" en "MM / dd / aaaa" en javascript?
dilipkumar1007

15

Otra posibilidad:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

Une los dígitos y reordenarlos


Además, la pregunta original especificaba "dd-mm-aaaa", no "mm-dd-aaaa", por lo que todavía está mal (pero solo).
Phil M Jones

@epascarello ¿Cómo convertir "Mes dd, aaaa" en "MM / dd / aaaa" en javascript?
dilipkumar1007

1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes el

7

Usando el ejemplo moment.js :

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)

1
momento (de, "DD-MM-AAAA"). toDate ()
Lapenkov Vladimir

6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);

3
¿Recibía Date.parseDate?
kasdega

@kasdega Lo siento, estaba pensando en $ .datepicker.parseDate, lo arreglé ahora :)
Saad Imran.

Debe usar $.datepicker.parseDate("dd-mm-yy", from);para analizar correctamente una fecha como 24-01-2017, la documentación de chek datepicker en api.jqueryui.com/datepicker
Andrea Mauro

4

También puede escribir una fecha dentro de los paréntesis del Date()objeto, como estos:

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)

@AmitSengar ¿Cómo convertir "Mes dd, aaaa" en "MM / dd / aaaa" en javascript?
dilipkumar1007

3

Use este formato: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00


1
¿De dónde sacaste esa parseDatefunción? ¿Es esa una función nativa de JavaScript?
Joseph Silber

lo siento, ¿cómo implemento esto? También necesito el formato como dd-mm-aa
user559142

parseDate es una función nativa de JS. Para obtener más información, consulte: xaprb.com/articles/javascript-date-parsing-demo.html
Diodeus - James MacFarlane

1
@Diodeus ... ¿realmente es nativo? ¿Cómo es que los errores de lanzamiento ff y chrome?
epascarello

2
@Diodeus, incluso con la última edición, esto no funciona para mí (con Chrome al menos). Establece la fecha '2011-01-03'y la hora UTC en 00:00:00. Entonces, si la zona horaria del usuario es menor que UTC, en realidad será el día anterior.
Mike

3

En mi caso

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

Resultado: Lun Nov 02 2015 04:40:13 GMT + 0100 (CET) luego uso .getTime () para trabajar con milisegundos


3

La respuesta aceptada tiene un error

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Considere si el selector de fecha contiene "77-78-7980" que obviamente no es una fecha válida. Esto resultaría en:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

Lo cual probablemente no sea el resultado deseado.

La razón de esto se explica en el sitio de MDN :

Cuando se llama a Date como un constructor con más de un argumento, si los valores son mayores que su rango lógico (por ejemplo, 13 se proporciona como el valor del mes o 70 para el valor de los minutos), el valor adyacente se ajustará. Por ejemplo, new Date(2013, 13, 1)es equivalente a new Date(2014, 1, 1).


Una mejor manera de resolver el problema es:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

Esto le brinda la posibilidad de manejar entradas no válidas.

Por ejemplo:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}


1

Eche un vistazo a Datejs para todos esos problemas relacionados con fechas pequeñas. También podría resolver esto mediante la función parseDate


0

Podrías usar un Regexp.

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}

Produce el mes equivocado! Los meses comienzan en cero, no uno. Entonces, si
hicieras

1
@epascarello - Olvidé cuán aburrida es la API de fecha.
ChaosPandion

@ChaosPandion: ¿cómo convertir myDate = '20 / 06/17 'al formato '20 / 6/2017 00:00:00' en javascript?
Ghanshyam Lakhani

-1
new Date().toLocaleDateString();

así de simple, simplemente pase su fecha a js Date Object


¿Te refieres a pasar la cadena de fecha dentro del constructor de fecha como, new Date('30/12/2018').toLocaleDateString()?? Eso devuelve Fecha inválida
Ms.Tamil
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.