Converti la stringa gg-mm-aaaa fino ad oggi


184

Sto provando a convertire una stringa nel formato gg-mm-aaaa in un oggetto data in JavaScript usando quanto segue:

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

("#datepicker").val()contiene una data nel formato gg-mm-aaaa. Quando eseguo le seguenti operazioni, ottengo "Data non valida":

alert(f);

È a causa del simbolo '-'? Come posso superare questo?


Questo succede con tutte le date o una in particolare?
Kasdega,

Risposte:


326

Dividersi "-"

Analizza la stringa nelle parti necessarie:

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

Usa regex

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

Perché non usare regex?

Perché sai che lavorerai su una stringa composta da tre parti, separate da trattini.

Tuttavia, se stavi cercando quella stessa stringa all'interno di un'altra stringa, regex sarebbe la strada da percorrere.

riutilizzo

Perché lo stai facendo più di una volta nel tuo codice di esempio, e forse altrove nella tua base di codice, avvolgilo in una funzione:

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

Usando come:

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

O se non ti dispiace jQuery nella tua funzione:

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

Usando come:

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

JavaScript moderno

Se sei in grado di utilizzare JS più moderni, la destrutturazione dell'array è anche un bel tocco:

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

9
battimi ... ma uso ancora DateJs. Questo non è esattamente corretto a causa di un errore post recinzione. il mese è 0-11 quindi è necessario sottrarre 1. f = nuova data (da [2], da [1] -1, da [0]);
Kasdega,

12
Risposta selezionata con un bug che produce date errate. Eccezionale!
epascarello,

3
Saluti @kasdega - Modificato ... poco fa!
Adrian Lynch,

@AdrianLynch Come convertire "Month gg, aaaa" in "MM / gg / aaaa" in javascript?
dilipkumar1007,

1
L'opzione JavaScript moderna di @Adrian Lynch è fantastica! Grazie.
Alexandre Ribeiro,

134

esempio di espressione regolare:

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

8
Una revisione che prende anche /è delimitatore e un anno composto da 2 cifre (o qualsiasi conteggio maggiore di 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki

1
Perché questa dovrebbe essere la risposta selezionata @AdemirNuno? Perché usare RegEx per una stringa in un formato noto? Non stai cercando uno schema, sai che il primo numero è il giorno, il secondo il mese e il terzo l'anno. In questo caso, RegEx è lo strumento sbagliato per il lavoro.
Adrian Lynch,

Una revisione che accetta delimitatori senza cifre, date senza zeri iniziali e anni a 2 o 4 cifre: new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") ); en.wikipedia.org/wiki/Date_format_by_country
PaulH

è così pratica ragazzo, grazie. il mio formato data viene fornito con l'ora, quindi lo ricodico come: 'nuova data ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' è giusto?
Kamuran Sönecek,

@NeerajSingh Come convertire "Mese gg, aaaa" in "MM / gg / aaaa" in javascript?
dilipkumar1007,

15

Un'altra possibilità:

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

Abbina le cifre e riordinale


Anche la domanda originale specificava "gg-mm-aaaa", non "mm-gg-aaaa", quindi è ancora sbagliato (ma solo giusto).
Phil M Jones,

@epascarello Come convertire "Month gg, aaaa" in "MM / gg / aaaa" in javascript?
dilipkumar1007,

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

7

Utilizzando l' esempio di 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 (da, "GG-MM-AAAA"). a Data ()
Lapenkov Vladimir

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

3
Stavi ottenendo Date.parseDate?
Kasdega,

@kasdega Mi dispiace, stavo pensando a $ .datepicker.parseDate, risolto ora :)
Saad Imran.

Dovresti usare $.datepicker.parseDate("dd-mm-yy", from);per analizzare correttamente una data come 24-01-2017, consulta la documentazione di datepicker
Andrea Mauro

4

Puoi anche scrivere una data tra parentesi Date()dell'oggetto, come queste:

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 Come convertire "Mese gg, aaaa" in "MM / gg / aaaa" in javascript?
dilipkumar1007,

3

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


1
Da dove hai preso quella parseDatefunzione? È una funzione javascript nativa?
Joseph Silber,

scusa come posso implementarlo? inoltre ho bisogno del formato come gg-mm-aa
user559142

parseDate è una funzione JS nativa. Per maggiori informazioni, consultare: xaprb.com/articles/javascript-date-parsing-demo.html
Diodeus - James MacFarlane il

1
@Diodeus ... è davvero nativo? come mai ff e chrome lanciano errori?
epascarello,

2
@Diodeus anche con l'ultima modifica non funziona affatto per me (almeno con Chrome). Imposta la data '2011-01-03'e l'ora UTC su 00:00:00. Quindi, se il fuso orario dell'utente è inferiore a UTC, sarà effettivamente il giorno prima.
Mike,

3

Nel mio caso

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

Risultato: lun 02 nov 2015 04:40:13 GMT + 0100 (CET) quindi utilizzo .getTime () per lavorare con millisecondi


3

La risposta accettata ha un bug

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

Considera se il datepicker contiene "77-78-7980" che ovviamente non è una data valida. Ciò comporterebbe:

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

Che probabilmente non è il risultato desiderato.

Il motivo è spiegato sul sito MDN :

Laddove Date viene chiamato come costruttore con più di un argomento, se i valori sono maggiori del loro intervallo logico (ad es. 13 viene fornito come valore del mese o 70 per il valore dei minuti), il valore adiacente verrà regolato. Ad esempio new Date(2013, 13, 1)è equivalente a new Date(2014, 1, 1).


Un modo migliore per risolvere il problema è:

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

Questo ti dà la possibilità di gestire input non validi.

Per esempio:

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

Dai un'occhiata a Datejs per tutti quei piccoli problemi relativi alla data. Puoi risolverlo anche con la funzione parseDate


0

È possibile utilizzare 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 il mese sbagliato! I mesi iniziano da zero, non uno. Quindi se lo facessi Jan, il tuo direbbe febbraio
epascarello il

1
@epascarello: ho dimenticato quanto è scadente l'API Date.
ChaosPandion,

@ChaosPandion: come convertire myDate = '20 / 06/17 'nel formato '20 / 6/2017 00:00:00' in javascript?
Ghanshyam Lakhani,

-1
new Date().toLocaleDateString();

così semplice, basta passare la data a js Date Object


Intendi passare la stringa della data all'interno del costruttore Date come new Date('30/12/2018').toLocaleDateString()?? Che restituisce la data non valida
Ms.Tamil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.