Konwertuj ciąg dd-mm-rrrr na datę

184

Usiłuję przekonwertować ciąg w formacie dd-mm-rrrr na obiekt daty w JavaScript za pomocą:

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

("#datepicker").val()zawiera datę w formacie dd-mm-rrrr. Gdy wykonam następujące czynności, pojawia się komunikat „Nieprawidłowa data”:

alert(f);

Czy to z powodu symbolu „-”? Jak mogę to przezwyciężyć?

użytkownik559142
źródło
Czy dzieje się tak w przypadku wszystkich dat, czy w szczególności jednej?
kasdega

Odpowiedzi:

326

Podzielone na "-"

Parsuj ciąg w potrzebne części:

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

Użyj wyrażenia regularnego

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

Dlaczego nie użyć wyrażenia regularnego?

Ponieważ wiesz, że będziesz pracował na sznurku złożonym z trzech części, oddzielonych łącznikami.

Jeśli jednak szukałeś tego samego ciągu w innym ciągu, regex byłby dobrym rozwiązaniem.

Ponowne użycie

Ponieważ robisz to więcej niż raz w przykładowym kodzie, a może gdzie indziej w bazie kodu, zawiń go w funkcji:

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

Używając jako:

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

Lub jeśli nie masz nic przeciwko jQuery w swojej funkcji:

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

Używając jako:

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

Nowoczesny JavaScript

Jeśli jesteś w stanie użyć bardziej nowoczesnego JS, restrukturyzacja tablicy jest również miłym akcentem:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}
Adrian Lynch
źródło
9
pobił mnie do tego ... ale nadal używam DateJs. To nie jest dokładnie poprawne z powodu błędu słupka ogrodzeniowego. miesiąc wynosi 0-11, więc musisz odjąć 1. f = nowa data (od [2], od [1] -1, od [0]);
kasdega
12
Wybrana odpowiedź z błędem, który powoduje nieprawidłowe daty. Niesamowite!
epascarello
3
Pozdrawiam @kasdega - Edytowałem to ... jakiś czas temu!
Adrian Lynch
@AdrianLynch Jak przekonwertować plik „Month dd, rrrr” na „MM / dd / rrrr” w javascript?
dilipkumar1007
1
@Adrian Lynch Nowoczesna opcja JavaScript jest świetna! Dziękuję Ci.
Alexandre Ribeiro,
134

przykład wyrażenia regularnego:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );
epascarello
źródło
8
Korekta, która również ma miejsce, /to separator i rok składający się z 2 cyfr (lub dowolnej liczby większej niż 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki
1
Dlaczego powinna to być wybrana odpowiedź @AdemirNuno? Dlaczego warto używać RegEx dla łańcucha w znanym formacie? Nie szukasz wzoru, wiesz, że pierwszy numer to dzień, drugi miesiąc, a trzeci rok. RegEx jest nieodpowiednim narzędziem do pracy w tym przypadku.
Adrian Lynch
Wersja, która przyjmuje new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") );
znaki
to takie ćwiczenie, dzięki. mój format daty pochodzi z czasem, więc przekodowałem go jako: „nowa data („ 13-01-2011 ”.replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , „2 USD / 1 USD / 3 USD”)); ” czy to jest poprawne?
Kamuran Sönecek
@NeerajSingh Jak przekonwertować plik „Month dd, rrrr” na „MM / dd / rrrr” w javascript?
dilipkumar1007
15

Inna możliwość:

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

Dopasuj cyfry i zmień ich kolejność

Joe
źródło
Również pierwotne pytanie określało „dd-mm-rrrr”, a nie „mm-dd-rrrr”, więc nadal jest błędne (ale tylko tylko).
Phil M Jones
@epascarello Jak przekonwertować plik „Month dd, rrrr” na „MM / dd / rrrr” w javascript?
dilipkumar1007
1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes,
7

Korzystając z przykładu 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
źródło
1
moment (z „DD-MM-RRRR”). toDate ()
Lapenkov Vladimir
6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);
Saad Imran.
źródło
3
Czy otrzymujesz Date.parseDate?
kasdega
@kasdega Niestety, myślałem o $ .datepicker.parseDate, naprawiłem to teraz :)
Saad Imran.
Powinieneś użyć, $.datepicker.parseDate("dd-mm-yy", from);aby poprawnie przeanalizować datę, na przykład 24-01-2017, sprawdź
Andrea Mauro
4

Możesz także wpisać datę w nawiasach Date()obiektu, na przykład:

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)
Więzień ZERO
źródło
@AmitSengar Jak przekonwertować plik „Month dd, rrrr” na „MM / dd / rrrr” w javascript?
dilipkumar1007
3

Użyj tego formatu: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00

Diodeus - James MacFarlane
źródło
1
Skąd masz tę parseDatefunkcję? Czy to natywna funkcja javascript?
Joseph Silber
przepraszam, jak to zaimplementować? też potrzebuję formatu jako dd-mm-rr
user559142
parseDate to natywna funkcja JS. Aby uzyskać więcej informacji, zobacz: xaprb.com/articles/javascript-date-parsing-demo.html
Diodeus - James MacFarlane
1
@Diodeus ... czy naprawdę jest rodzimy? skąd pochodzą błędy rzucania FF i Chrome?
epascarello
2
@Diodeus nawet przy ostatniej edycji nie działa to dla mnie (przynajmniej z Chrome). Ustawia datę '2011-01-03'i czas UTC na 00:00:00. Więc jeśli strefa czasowa użytkownika jest mniejsza niż UTC, to faktycznie będzie to dzień wcześniej.
Mike
3

W moim przypadku

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

Wynik: Pon Lis 02 2015 04:40:13 GMT + 0100 (CET), a następnie używam .getTime () do pracy z milisekundami

argene santoni
źródło
3

Przyjęta odpowiedź ma błąd

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

Zastanów się, czy datepicker zawiera „77-78-7980”, co oczywiście nie jest prawidłową datą. Spowodowałoby to:

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

Co prawdopodobnie nie jest pożądanym rezultatem.

Przyczynę tego wyjaśniono na stronie MDN :

Jeśli data jest wywoływana jako konstruktor z więcej niż jednym argumentem, jeśli wartości są większe niż ich zakres logiczny (np. 13 jest podana jako wartość miesiąca lub 70 dla wartości minutowej), sąsiednia wartość zostanie dostosowana. Np. new Date(2013, 13, 1)Jest równoważne z new Date(2014, 1, 1).


Lepszym sposobem rozwiązania problemu jest:

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

Daje to możliwość obsługi nieprawidłowych danych wejściowych.

Na przykład:

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
źródło
1

Spójrz na Datejs dla wszystkich tych drobnych problemów związanych z datą. Możesz to rozwiązać również przez funkcję parseDate

Baz1nga
źródło
0

Możesz użyć 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
źródło
Produkuje zły miesiąc! Miesiące zaczynają się od zera, a nie jednego. Więc jeśli zrobiłbyś Jan, twój powiedziałby, że luty
epascarello
1
@epascarello - Zapomniałem, jak kiepski jest Date API.
ChaosPandion
@ChaosPandion: jak przekonwertować myDate = „20/06/17” na format „20/6/2017 00:00:00” w javascript?
Ghanshyam Lakhani
-1
new Date().toLocaleDateString();

proste, po prostu podaj swoją datę do js Date Object

Nikhil Sengar
źródło
Czy masz na myśli przekazanie ciągu daty do konstruktora daty, na przykład new Date('30/12/2018').toLocaleDateString()? Zwraca nieprawidłową datę
Pani Tamil