Jak przekonwertować ciąg znaków na datę i godzinę ze specyfikacją formatu w JavaScript?


208

Jak przekonwertować ciąg znaków na obiekt daty i czasu w javascript, określając ciąg formatu?

Szukam czegoś takiego:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");

2
BTW kropki i łączniki mogą się nie powieść jako separatory daty, ukośniki są w porządku, więc (do granic moich testów) Javascript zaakceptuje „2011/08/22 10:30:00”, ale jeszcze nie (pomimo ISO 8601) „2011-09 -02 15:58:40 "który - jak twierdzi - jest obsługiwany w Javascript 1.8.5.
Dave Everitt,

Funkcja date.parse analizuje ciąg daty w formacie „mm / dd / rrrr”. Przed zastosowaniem analizy składni przekonwertuj ciąg na format „mm / dd / rrrr”.

Dlaczego nie podać daty w wymaganym formacie? Robię to jak nową datę („2012 11 25 18:00:00”); i to działa!
foxybagga,

Odpowiedzi:


88

Myślę, że to może ci pomóc: http://www.mattkruse.com/javascript/date/

Istnieje getDateFromFormat()funkcja, którą możesz nieco ulepszyć, aby rozwiązać problem.

Aktualizacja: dostępna jest zaktualizowana wersja próbek dostępna na javascripttoolbox.com


5
TypeError: Object Date has no method 'getDateFromFormat'
Derek 朕 會 功夫

6
Metoda getDateFromFormat jest dostępna w dokumencie, w powyższym linku. Źródło dostępne tutaj: mattkruse.com/javascript/date/source.html
Rafael Mueller

1
+1, dobra biblioteka ... czysty javascript ... to fantastyczne. dziękuję
Surendra Jnawali

7
Oba linki są martwe
Sytham,

1
Jeśli możesz, zaktualizuj link. To już nie pomaga.
Tallerlei

98

Użyj jeśli twój ciąg jest zgodny z . Jeśli twój format jest niekompatybilny (tak mi się wydaje), musisz sam przeanalizować ciąg (powinno to być łatwe z wyrażeniami regularnymi) i utworzyć nowy obiekt Date z wyraźnymi wartościami dla roku, miesiąca, daty, godziny, minuty i sekundy.new Date(dateString)Date.parse()


1
Date.parse to najlepsze rozwiązanie! Analizuje prawie wszystko! +1
ianaz

7
@ianaz: PRAWIE wszystko używane w Ameryce, ale brak formatu używanego przez dużą część Europy jest zbyt duże „prawie”. Ale nowa data jest dobrą podstawą do niestandardowych funkcji.
Pavel V.

new Date (dateString) działał dobrze dla mnie, Date.parse () zamiast tego konwertuje na milisekundy, a więc zwraca liczbę inną niż typ Date.
Reagan Ochora

68

@Christoph Wspomnienia za pomocą wyrażenia regularnego, aby rozwiązać problem. Oto czego używam:

var dateString = "2010-08-09 01:02:03";
var reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var dateArray = reggie.exec(dateString); 
var dateObject = new Date(
    (+dateArray[1]),
    (+dateArray[2])-1, // Careful, month starts at 0!
    (+dateArray[3]),
    (+dateArray[4]),
    (+dateArray[5]),
    (+dateArray[6])
);

Nie jest bynajmniej inteligentny, wystarczy skonfigurować regex i new Date(blah)dopasować go do swoich potrzeb.

Edycja: Może nieco bardziej zrozumiały w ES6 przy użyciu destrukcji:

let dateString = "2010-08-09 01:02:03"
  , reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
  , [, year, month, day, hours, minutes, seconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds);

Ale szczerze mówiąc, obecnie sięgam po coś takiego jak Moment


19
@ bažmegakapa zamiast płakać, być może zredagowałeś odpowiedź i dodałeś „var's yourself”?
OrganicPanda

Dlaczego używasz /gflagi tylko po to, lastIndexaby 0później ustawić ? Po prostu nie używaj globalnego dopasowania.
Ry-

1
@minitech To /gbyła niechlujna kopia / wklej z istniejącego projektu. lastindexzostał dodany przez redaktora (aby zwalczyć, jak \gsądzę?). Teraz je usunę. Dziękuję za zwrócenie na to uwagi.
OrganicPanda

1
bardzo miła odpowiedź .. naprawdę przydatna dla mnie
Jethik

14

W JavaScript nie ma żadnych zaawansowanych procedur formatowania daty / godziny.

Będziesz musiał użyć zewnętrznej biblioteki do sformatowania danych wyjściowych, „JavaScript Date Format” z Flagrant Badassery wygląda bardzo obiecująco.

W przypadku konwersji wejściowej poczyniono już kilka sugestii. :)


3
„trzeba” jest względne. Oczywiście możesz zbudować własną implementację. :)
Tomalak

13

Sprawdź Moment.js . Jest to nowoczesna i potężna biblioteka, która rekompensuje żałosne funkcje JavaScript (lub ich brak).


3
Nie przegłosowałem, ale być może byłoby miło wiedzieć, która funkcja w Moment.js dałaby pożądane zachowanie (dla nas leniwi ludzie, którzy już używają Moment.js, ale nie znają konkretnej funkcji, której należy użyć) .
Mat.

Lokalizacja wygląda obiecująco, wybierz dowolną lokalizację w Europie Środkowej dla formatu kropkowego. Jednak nie przetestowałem tego, a pełnego formatu daty i godziny nie ma w przykładach, które widziałem.
Pavel V.

Nie przegłosowałem, ale chciałem tylko powiedzieć, że to jest powolne. Na komputerze w porządku, ale na telefonie komórkowym może być zbyt wolny (w zależności od potrzeb).
gabn88

11

Tylko dla zaktualizowanej odpowiedzi tutaj, dobra biblioteka js na http://www.datejs.com/

Datejs to otwarta biblioteka źródeł danych JavaScript do analizowania, formatowania i przetwarzania.


Wycofałem tę edycję, chociaż bardzo pomocna, należy ją dodać jako komentarz lub osobną odpowiedź.
Alexis Abril

W każdym razie było za długo na komentarz, a dodanie duplikatu odpowiedzi jest błędne. To pytanie ma ponad 155 000 wyświetleń - przekażmy tym osobom jak najwięcej informacji! (tak przy okazji - edytowanie istniejącej odpowiedzi jest bardzo powszechne w przepełnieniu stosu - prawdopodobnie poczułbyś się gorzej, gdybym po prostu skopiował twoją odpowiedź ...)
Kobi

1
W każdym razie, jeśli nie podoba ci się moja edycja, to jest w porządku, ale rozszerz swoją odpowiedź - „Tylko dla zaktualizowanej odpowiedzi tutaj” jest wypełniaczem i brakuje w niej niektórych szczegółów. Nawiasem mówiąc, to pytanie zyskuje obecnie trochę uwagi , dlatego nagle otrzymałeś 5 głosów.
Kobi

7
var temp1 = "";
var temp2 = "";

var str1 = fd; 
var str2 = td;

var dt1  = str1.substring(0,2);
var dt2  = str2.substring(0,2);

var mon1 = str1.substring(3,5);
var mon2 = str2.substring(3,5);

var yr1  = str1.substring(6,10);  
var yr2  = str2.substring(6,10); 

temp1 = mon1 + "/" + dt1 + "/" + yr1;
temp2 = mon2 + "/" + dt2 + "/" + yr2;

var cfd = Date.parse(temp1);
var ctd = Date.parse(temp2);

var date1 = new Date(cfd); 
var date2 = new Date(ctd);

if(date1 > date2) { 
    alert("FROM DATE SHOULD BE MORE THAN TO DATE");
}

5

Biblioteka zewnętrzna to przesada w analizowaniu jednej lub dwóch dat, więc utworzyłem własną funkcję, korzystając z rozwiązań Oli i Christoph . W Europie Środkowej rzadko używamy czegoś, ale format OP, więc powinno to wystarczyć dla prostych aplikacji używanych tutaj.

function ParseDate(dateString) {
    //dd.mm.yyyy, or dd.mm.yy
    var dateArr = dateString.split(".");
    if (dateArr.length == 1) {
        return null;    //wrong format
    }
    //parse time after the year - separated by space
    var spacePos = dateArr[2].indexOf(" ");
    if(spacePos > 1) {
        var timeString = dateArr[2].substr(spacePos + 1);
        var timeArr = timeString.split(":");
        dateArr[2] = dateArr[2].substr(0, spacePos);
        if (timeArr.length == 2) {
            //minutes only
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]));
        } else {
            //including seconds
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]), parseInt(timeArr[2]))
        }
    } else {
        //gotcha at months - January is at 0, not 1 as one would expect
        return new Date(parseInt(dateArr[2]), parseInt(dateArr[1] - 1), parseInt(dateArr[0]));
    }
}

4

Date.parse() jest dość inteligentny, ale nie mogę zagwarantować, że format zostanie poprawnie przeanalizowany.

Jeśli tak się nie stanie, musisz znaleźć coś, co rozwiąże te dwa problemy. Twój przykład jest dość prosty (jest to czysto cyfry), więc odrobina REGEX (a nawet string.split()- może być szybsza) w połączeniu z niektórymi parseInt()pozwoli ci szybko umówić się na randkę.


4
time = "2017-01-18T17:02:09.000+05:30"

t = new Date(time)

hr = ("0" + t.getHours()).slice(-2);
min = ("0" + t.getMinutes()).slice(-2);
sec = ("0" + t.getSeconds()).slice(-2);

t.getFullYear()+"-"+t.getMonth()+1+"-"+t.getDate()+" "+hr+":"+min+":"+sec

plus 1 po wywołaniu funkcji getmonth () wydaje się niepoprawny
Arjunsingh

Funkcja t.getMonth () + 1 jest poprawna, ponieważ funkcja Date.getMonth () zwraca wartość 0.
Jussi Palo

3

Żeby dać moje 5 centów.

Mój format daty to dd.mm.rrrr (format brytyjski) i żaden z powyższych przykładów nie działał dla mnie. Wszystkie analizatory analizowały mm jako dzień, a dd jako miesiąc.

Znalazłem tę bibliotekę: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ i zadziałało, ponieważ możesz podać kolejność pól takich jak to:

>>console.log(new Date(Date.fromString('09.05.2012', {order: 'DMY'})));
Wed May 09 2012 00:00:00 GMT+0300 (EEST)

Mam nadzieję, że to komuś pomoże.


Linki już nie żyją!

Cóż ... szybki archiwum.org pokazało: bitbucket.org/mazzarelli/js-date/downloads to adres URL projektu.
Anton Valqk,

1

Moment.js zajmie się tym:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;

1
Chociaż moment.js jest świetny, istnieje mnóstwo przypadków użycia, w których musisz po prostu użyć natywnego Javascript. Mój obecny przypadek użycia to funkcja mapy w CouchDB
Zach Smith,

1

Możesz do tego użyć biblioteki moment.js. Używam tylko do uzyskania danych wyjściowych zależnych od czasu, ale możesz wybrać rodzaj formatu, który chcesz wybrać.

Odniesienie:

1. biblioteka chwil: https://momentjs.com/

2. funkcje specyficzne dla godziny i daty: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

convertDate(date) {
        var momentDate = moment(date).format('hh : mm A');
        return momentDate;
}

i możesz wywołać tę metodę:

this.convertDate('2020-05-01T10:31:18.837Z');

Mam nadzieję, że to pomoże. Ciesz się kodowaniem.


0

Aby w pełni spełnić ciąg Date.parse, należy przekonwertować ciąg znaków na format dd-mm-RRRR, jak określono w RFC822, jeśli użyjesz parsowania rrrr-mm-dd, możesz popełnić błędy.


Do Twojej wiadomości, Od RFC 822 (strona: 25. Częściowo wyczyszczono, aby zachować długość tekstu komentarza): 13 sierpnia 1982 - 25 - RFC # 822 5. SPECYFIKACJA DATY I CZASU 5.1. SYNTAX date-time = [dzień ”,„] data i godzina; dd mm rr gg: mm: ss zzz dzień = „pon” / „wt” / „środa” / „czw” / „pt” / „sob” / „niedziela” data = 1 * 2DIGIT miesiąc 2DIGIT; dzień miesiąc rok np. 20 czerwca 82 miesiąc = „Jan” / „luty” / „marzec” / „kwiecień” / „maj” / „czerwiec” / „lipiec” / „sierpień” / „wrz” / „październik” / „ Nov "/" Dec "
Valentin Rusk

0
//Here pdate is the string date time
var date1=GetDate(pdate);
    function GetDate(a){
        var dateString = a.substr(6);
        var currentTime = new Date(parseInt(dateString ));
        var month =("0"+ (currentTime.getMonth() + 1)).slice(-2);
        var day =("0"+ currentTime.getDate()).slice(-2);
        var year = currentTime.getFullYear();
        var date = day + "/" + month + "/" + year;
        return date;
    }

Pytający zapytał o określenie ciągu formatu .
Armali,

@Armali Parametr wejściowy, taki jak „/ Date (1552415400000) /” w formacie łańcuchowym
Abhishek Kanrar
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.