Cum pot converti un șir de caractere în data cu specificarea formatului în JavaScript? (Programare, Javascript, Datetime, Conversie De Tip)

Serhat Ozgel a intrebat.

Cum pot converti un șir de caractere într-un obiect dată-timp în javascript prin specificarea unui șir de format?

Caut ceva de genul:

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

Comentarii

  • BTW punctele și cratimele pot eșua ca separatori de date, slash-urile sunt în regulă, astfel încât (în limitele testelor mele) Javascript va accepta „2011/08/22 10:30:00”, dar nu încă (în ciuda ISO 8601) „2011-09-02 15:58:40” care – se susține – este acceptat în Javascript 1.8.5 pe. –  > Por Dave Everitt.
  • Funcția Date.parse analizează șirul de date care este în format „mm/dd/aaaa”. Vă rugăm să convertiți șirul în formatul „mm/dd/aaaa” înainte de a aplica Parse. – user958894
  • De ce nu furnizați data în formatul cerut? Eu o fac ca new Date(‘2012 11 25 18:00:00’); și funcționează! –  > Por foxybagga.
15 răspunsuri
Rafael Mueller

Cred că acest lucru vă poate ajuta: http://www.mattkruse.com/javascript/date/

Există un getDateFromFormat() funcție pe care o poți modifica puțin pentru a rezolva problema ta.

Actualizare: există o versiune actualizată a mostrelor disponibile la adresa javascripttoolbox.com

Comentarii

  • TypeError: Object Date has no method 'getDateFromFormat' –  > Por Derek 朕會功夫.
  • +1, bibliotecă bună…javascript pur…este fantastic. mulțumesc –  > Por Surendra Jnawali.
  • Ambele linkuri sunt moarte –  > Por Sytham.
  • Dacă puteți, vă rugăm să actualizați link-ul. Acest lucru nu mai ajută. –  > Por Tallerlei.
  • Din nefericire javascripttoolbox.com este, de asemenea, căzut. –  > Por vchan.
Christoph

Utilizați new Date(<i>dateString</i>) dacă șirul dvs. este compatibil cu Date.parse(). Dacă formatul dvs. este incompatibil (cred că este), trebuie să analizați singur șirul (ar trebui să fie ușor cu expresii regulate) și să creați un fișier nou obiect Date cu valori explicite pentru an, lună, dată, oră, minut și secundă.

Comentarii

  • Date.parse este cea mai bună soluție! Parsează aproape totul! +1 –  > Por ianaz.
  • @ianaz: Aproape tot ce se folosește în America, dar lipsește formatul folosit de o mare parte din Europa este un „aproape” prea mare. Dar noul Date este o bază bună pentru funcții personalizate. –  > Por Pavel V..
  • new Date(dateString) a funcționat bine pentru mine, Date.parse() în schimb convertește în milisecunde și astfel returnează un număr și nu un tip Date. –  > Por Reagan Ochora.
OrganicPanda

@Christoph Menționează utilizarea unui regex pentru a rezolva problema. Iată ce folosesc eu:

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

Nu este în niciun caz inteligent, doar configurați regex-ul și new Date(blah) pentru a se potrivi nevoilor tale.

Edit: Poate un pic mai ușor de înțeles în ES6 folosind destructurarea:

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

Dar, cu toată onestitatea, în aceste zile ajung la ceva de genul Moment

Comentarii

    19

  • @bažmegakapa în loc să plângi, poate că ai fi putut edita răspunsul și să adaugi tu însuți ‘var’s? –  > Por OrganicPanda.
  • De ce folosești /g flag, doar pentru a seta lastIndex la 0 după aceea? Pur și simplu nu folosiți o potrivire globală. –  > Por Ry-.
  • @minitech The /g a fost un copy/paste neglijent de la un proiect existent. lastindex a fost adăugat de un editor (pentru a combate g presupun?). Le voi elimina acum. Mulțumesc pentru că ați subliniat acest lucru. –  > Por OrganicPanda.
  • foarte frumos răspuns ..foarte util pentru mine –  > Por Jethik.
Tomalak

Nu există rutine sofisticate de formatare a datei/orei în JavaScript.

Va trebui să folosiți o bibliotecă externă pentru ieșirea formatată a datei, „JavaScript Date Format” de la Flagrant Badassery pare foarte promițătoare.

Pentru conversia de intrare, au fost făcute deja mai multe sugestii. 🙂

Comentarii

  • „trebuie să” este relativ. Bineînțeles că vă puteți construi propria implementare. 🙂 –  > Por Tomalak.
Aaron Gray

Consultați Moment.js. Este o bibliotecă modernă și puternică, care compensează funcțiile Date (sau lipsa lor) din JavaScript.

Comentarii

  • Nu am dat downvote, dar poate că ar fi fost frumos să se știe exact ce funcție din Moment.js ar da comportamentul dorit (pentru noi, oamenii leneși care folosim deja Moment.js, dar nu știm ce funcție anume să folosim). –  > Por Matt.
  • Localizarea pare promițătoare, alegeți orice localitate central-europeană pentru formatul punct. Cu toate acestea, nu am testat-o și formatul datetime complet nu se regăsește în exemplele pe care le-am văzut. –  > Por Pavel V..
  • Nu am dat downvote, dar am vrut doar să spun că este lent. Pentru desktop ok, dar pentru mobil s-ar putea să fie prea lent (în funcție de nevoile tale). –  > Por gabn88.
Alexis Abril

Doar pentru un răspuns actualizat aici, există o librărie js bună la http://www.datejs.com/

Datejs este o bibliotecă JavaScript Date open source pentru parsare, formatare și procesare.

Comentarii

  • Rolled back acea editare, deși foarte utilă, ar trebui să fie adăugată ca un comentariu sau un răspuns separat. –  > Por Alexis Abril.
  • Oricum era prea lung pentru un comentariu, iar adăugarea unui răspuns duplicat este greșită. Această întrebare are peste 155.000 de vizualizări – haideți să le oferim acestor oameni cât mai multe informații! (apropo – este foarte comun în Stack Overflow să editezi un răspuns existent – probabil că te-ai simți mai rău dacă ți-aș copia pur și simplu răspunsul…) –  > Por Kobi.
  • Și oricum, dacă nu-ți place editarea mea, e în regulă, dar te rog să îți extinzi răspunsul – „Doar pentru un răspuns actualizat aici” este o umplutură, și lipsesc unele detalii. Apropo, această întrebare primește o oarecare atenție în acest moment, motiv pentru care ai primit brusc 5 voturi. –  > Por Kobi.
navin
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");
}

user1134181

Pavel V.

Librăria externă este o exagerare pentru a analiza una sau două date, așa că mi-am făcut propria funcție folosind soluțiile lui Oli și Christoph. Aici, în Europa Centrală, rar folosim aything decât formatul lui OP, așa că ar trebui să fie suficient pentru aplicațiile simple folosite aici.

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

Oli

Date.parse() este destul de inteligent, dar nu pot garanta că formatul va fi analizat corect.

Dacă nu o face, va trebui să găsiți ceva care să facă legătura între cele două. Exemplul dvs. este destul de simplu (fiind vorba doar de numere), așa că o atingere de REGEX (sau chiar de string.split() — ar putea fi mai rapid) combinat cu un pic de parseInt() îți va permite să faci rapid o dată.

puneet18
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

Comentarii

  • plus 1 după apelarea funcției getmonth() pare greșit –  > Por Arjunsingh.
  • t.getMonth()+1 este corect, deoarece Date.getMonth() returnează o valoare bazată pe 0. –  > Por Jussi Palo.
Anton Valqk

Doar pentru a-mi da cei 5 cenți.

Formatul meu de dată este dd.mm.yyyy (format UK) și niciunul dintre exemplele de mai sus nu a funcționat pentru mine. Toate analizoarele considerau mm ca zi și dd ca lună.

Am găsit această bibliotecă: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/și a funcționat, pentru că puteți spune ordinea câmpurilor astfel:

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

Sper că ajută pe cineva.

Comentarii

Chintsu

Moment.js se va ocupa de acest lucru:

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

Comentarii

  • În timp ce moment.js este grozav, există o multitudine de cazuri de utilizare în care trebuie să folosiți doar Javascript nativ. Cazul meu actual de utilizare este o funcție Map în CouchDB –  > Por Zach Smith.
amit pandya

Puteți utiliza biblioteca moment.js pentru acest lucru. Eu o folosesc doar pentru a obține o ieșire specifică timpului, dar puteți selecta ce tip de format doriți să selectați.

Referință:

1. Biblioteca moment: https://momentjs.com/

2. Funcții specifice datei și orei: 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 puteți apela această metodă în felul următor:

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

Sper că vă ajută. Codare plăcută.

Valentin Rusk

Pentru a satisface pe deplin cerința Date.parse convertește șirul în formatul dd-mm-YYYY așa cum este specificat în RFC822,dacă folosești yyyy-mm-dd parse poate face o greșeală.

Comentarii

  • FYI, din RFC 822 (pagina: 25. Parțial curățat pentru a respecta lungimea textului pentru comentariu): 13 august 1982 – 25 – RFC #822 5. SPECIFICAREA DATA ȘI ORA 5.1. DATA ȘI ORA SYNTAX date-time = [ day „,” ] date time ; dd mm yy hh:mm:ss zzz day = „Mon” / „Tue” / „Wed” / „Thu” / „Fri” / „Sat” / „Sun” date = 1*2DIGIT month 2DIGIT ; day month year ex. 20 Jun 82 month = „Jan” / „Feb” / „Mar” / „Apr” / „May” / „Jun” / „Jul” / „Aug” / „Sep” / „Oct” / „Nov” / „Dec” –  > Por Valentin Rusk.
Abhishek Kanrar
//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;
    }

Comentarii

  • Chestionarul a cerut specificarea unui șir de formate. –  > Por Armali.
  • @Armali Parametru de intrare ca „/Data(1552415400000)/” în format șir de caractere –  > Por Abhishek Kanrar.