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ć?


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)
}

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") );

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ść


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)

1
moment (z „DD-MM-RRRR”). toDate ()
Lapenkov Vladimir

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

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)

@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


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


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
}


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


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)
    );
}

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.