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");
Serhat Ozgel
źródło
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

Rafael Mueller
źródło
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()

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

OrganicPanda
źródło
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. :)

Tomalak
źródło
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).

Aaron Gray
źródło
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.

Alexis Abril
źródło
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");
}
navin
źródło
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]));
    }
}
Pavel V.
źródło
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ę.

Oli
źródło
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
puneet18
źródło
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.

Anton Valqk
źródło
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.;
Chintsu
źródło
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.

amit pandya
źródło
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.

Valentin Rusk
źródło
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;
    }
Abhishek Kanrar
źródło
Pytający zapytał o określenie ciągu formatu .
Armali,
@Armali Parametr wejściowy, taki jak „/ Date (1552415400000) /” w formacie łańcuchowym
Abhishek Kanrar