Konvertieren Sie TT-MM-JJJJ-Zeichenfolge in Datum

184

Ich versuche, eine Zeichenfolge im Format TT-MM-JJJJ in ein Datumsobjekt in JavaScript zu konvertieren, indem ich Folgendes verwende:

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

("#datepicker").val()enthält ein Datum im Format TT-MM-JJJJ. Wenn ich Folgendes mache, erhalte ich "Ungültiges Datum":

alert(f);

Liegt das am '-' Symbol? Wie kann ich das überwinden?

user559142
quelle
Geschieht dies bei allen Daten oder bei einem bestimmten?
Kasdega

Antworten:

325

Aufgeteilt auf "-"

Analysieren Sie den String in die Teile, die Sie benötigen:

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

Verwenden Sie Regex

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

Warum nicht Regex verwenden?

Weil Sie wissen, dass Sie an einer Zeichenfolge arbeiten, die aus drei Teilen besteht, die durch Bindestriche getrennt sind.

Wenn Sie jedoch nach derselben Zeichenfolge in einer anderen Zeichenfolge suchen, ist Regex der richtige Weg.

Wiederverwendung

Da Sie dies mehr als einmal in Ihrem Beispielcode und möglicherweise an anderer Stelle in Ihrer Codebasis tun, schließen Sie es in eine Funktion ein:

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

Verwenden als:

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

Oder wenn Ihnen jQuery in Ihrer Funktion nichts ausmacht:

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

Verwenden als:

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

Modernes JavaScript

Wenn Sie moderneres JS verwenden können, ist die Array-Destrukturierung auch eine nette Geste:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}
Adrian Lynch
quelle
9
schlag mich drauf ... aber ich benutze immer noch DateJs. Dies ist aufgrund eines Zaunpfostenfehlers nicht genau richtig. der Monat ist 0-11, also müssen Sie 1 subtrahieren. f = neues Datum (von [2], von [1] -1, von [0]);
Kasdega
12
Ausgewählte Antwort mit einem Fehler, der falsche Daten erzeugt. Genial!
Epascarello
3
Cheers @kasdega - Bearbeitet ... vor einiger Zeit!
Adrian Lynch
@AdrianLynch Wie konvertiere ich "Monat TT, JJJJ" in "MM / TT / JJJJ" in Javascript?
Dilipkumar1007
1
@Adrian Lynch Moderne JavaScript-Option ist großartig! Danke dir.
Alexandre Ribeiro
134

Beispiel für einen regulären Ausdruck:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );
Epascarello
quelle
8
Eine Revision, die auch dauert, /ist Trennzeichen und ein Jahr aus 2 Ziffern (oder einer Zählung größer als 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki
1
Warum sollte dies die ausgewählte Antwort @AdemirNuno sein? Warum RegEx für eine Zeichenfolge in einem bekannten Format verwenden? Sie suchen kein Muster, Sie wissen, dass die erste Zahl der Tag, die zweite der Monat und die dritte das Jahr ist. RegEx ist in diesem Fall das falsche Werkzeug für den Job.
Adrian Lynch
Eine Revision, die nichtstellige Trennzeichen, Daten ohne führende Nullen und new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") );
zwei-
Es ist so ein Übungsmann, danke. Mein Datumsformat kommt mit der Zeit, also kodiere ich es neu als: 'neues Datum ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' ist es richtig?
Kamuran Sönecek
@NeerajSingh Wie konvertiere ich "Monat TT, JJJJ" in "MM / TT / JJJJ" in Javascript?
Dilipkumar1007
15

Andere Möglichkeit:

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

Passen Sie die Ziffern an und ordnen Sie sie neu

Joe
quelle
In der ursprünglichen Frage wurde auch "TT-MM-JJJJ" und nicht "MM-TT-JJJJ" angegeben, sodass es immer noch falsch ist (aber nur gerade).
Phil M Jones
@epascarello Wie konvertiere ich "Monat TT, JJJJ" in "MM / TT / JJJJ" in Javascript?
Dilipkumar1007
1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes
7

Verwenden Sie das Beispiel von moment.j :

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)
Makah
quelle
1
Moment (von "TT-MM-JJJJ"). toDate ()
Lapenkov Vladimir
6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);
Saad Imran.
quelle
3
Hast du Date.parseDate bekommen?
Kasdega
@kasdega Sorry, ich dachte an $ .datepicker.parseDate, habe es jetzt behoben :)
Saad Imran.
Sie sollten verwenden $.datepicker.parseDate("dd-mm-yy", from);, um ein Datum wie die 24-01-2017Check Datepicker-Dokumentation unter api.jqueryui.com/datepicker
Andrea Mauro am
4

Sie können auch ein Datum in die Klammern des Date()Objekts schreiben , wie folgt:

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)
Gefangener NULL
quelle
@AmitSengar Wie konvertiere ich "Monat TT, JJJJ" in "MM / TT / JJJJ" in Javascript?
Dilipkumar1007
3

Verwenden Sie dieses Format: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00

Diodeus - James MacFarlane
quelle
1
Woher hast du diese parseDateFunktion? Ist das eine native Javascript-Funktion?
Joseph Silber
Entschuldigung, wie implementiere ich das? auch ich brauche das format als
tt
parseDate ist eine native JS-Funktion. Weitere Informationen finden Sie unter: xaprb.com/articles/javascript-date-parsing-demo.html
Diodeus - James MacFarlane
1
@Diodeus ... ist es wirklich einheimisch? Wie kommt es, dass ff und Chrome Fehler werfen?
Epascarello
2
@Diodeus selbst bei der letzten Bearbeitung funktioniert das bei mir nicht ganz (zumindest bei Chrome). Es setzt das Datum auf '2011-01-03'und die UTC-Zeit auf 00:00:00. Wenn die Zeitzone des Benutzers kleiner als UTC ist, ist dies tatsächlich der Tag zuvor.
Mike
3

In meinem Fall

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

Ergebnis: Mon Nov 02 2015 04:40:13 GMT + 0100 (CET) dann verwende ich .getTime (), um mit Millisekunden zu arbeiten

argene santoni
quelle
3

Die akzeptierte Antwort hat einen Fehler

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

Überlegen Sie, ob der Datepicker "77-78-7980" enthält, was offensichtlich kein gültiges Datum ist. Dies würde führen zu:

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

Welches ist wahrscheinlich nicht das gewünschte Ergebnis.

Der Grund hierfür wird auf der MDN- Site erläutert :

Wenn Date als Konstruktor mit mehr als einem Argument aufgerufen wird und Werte größer als ihr logischer Bereich sind (z. B. 13 als Monatswert oder 70 als Minutenwert), wird der benachbarte Wert angepasst. ZB new Date(2013, 13, 1)ist äquivalent zu new Date(2014, 1, 1).


Ein besserer Weg, um das Problem zu lösen, ist:

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

Dies gibt Ihnen die Möglichkeit, ungültige Eingaben zu verarbeiten.

Beispielsweise:

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
quelle
0

Sie könnten einen Regexp verwenden.

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
quelle
Produziert den falschen Monat! Monate beginnen bei Null, nicht bei Eins. Also, wenn Sie Jan getan haben, würden Sie Februar
Epascarello
1
@epascarello - Ich habe vergessen, wie lahm die Datums-API ist.
ChaosPandion
@ChaosPandion: Wie konvertiere ich myDate = '20 / 06/17 'in das Format '20 / 6/2017 00:00:00' in Javascript?
Ghanshyam Lakhani
-1
new Date().toLocaleDateString();

Übergeben Sie einfach Ihr Datum an js Date Object

Nikhil Sengar
quelle
Meinen Sie damit, die Datumszeichenfolge im Datumskonstruktor wie new Date('30/12/2018').toLocaleDateString()folgt zu übergeben? Das gibt ungültiges Datum zurück
Frau Tamil