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?

usuario559142
fuente
¿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)
}
Adrian Lynch
fuente
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") );
epascarello
fuente
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

Joe
fuente
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)
Makah
fuente
1
momento (de, "DD-MM-AAAA"). toDate ()
Lapenkov Vladimir
6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);
Saad Imran.
fuente
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)
Prisionero CERO
fuente
@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

Diodeus - James MacFarlane
fuente
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

argene santoni
fuente
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
}
James Hibbard
fuente
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

Baz1nga
fuente
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)
    );
}
ChaosPandion
fuente
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

Nikhil Sengar
fuente
¿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