Come posso convertire la stringa in datetime con la specifica del formato in JavaScript?


208

Come posso convertire una stringa in un oggetto data / ora in JavaScript specificando una stringa di formato?

Sto cercando qualcosa come:

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

2
I punti e i trattini BTW possono fallire come separatori di date, le barre sono a posto, quindi (ai limiti dei miei test) Javascript accetterà "2011/08/22 10:30:00" ma non ancora (nonostante ISO 8601) "2011-09 -02 15:58:40 "che - si sostiene - è supportato in Javascript 1.8.5 su.
Dave Everitt,

La funzione Date.parse analizza la stringa della data che è nel formato "mm / gg / aaaa". Convertire la stringa nel formato "mm / gg / aaaa" prima di applicare Parse.

Perché non fornire la data nel formato richiesto? Lo faccio come nuovo Date ('2012 11 25 18:00:00'); e funziona!
Foxybagga,

Risposte:


88

Penso che questo possa aiutarti: http://www.mattkruse.com/javascript/date/

C'è una getDateFromFormat()funzione che puoi modificare leggermente per risolvere il tuo problema.

Aggiornamento: è disponibile una versione aggiornata degli esempi su javascripttoolbox.com


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

6
Il metodo getDateFromFormat è disponibile con il documento, sul collegamento sopra. Fonte disponibile qui: mattkruse.com/javascript/date/source.html
Rafael Mueller

1
+1, buona libreria..puro javascript ... è fantastico. grazie
Surendra Jnawali,

7
Entrambi i collegamenti sono morti
Sytham,

1
Se puoi, aggiorna il link. Questo non aiuta più.
Tallerlei il

98

Utilizzare se la stringa è compatibile con . Se il tuo formato è incompatibile (penso che lo sia), devi analizzare tu stesso la stringa (dovrebbe essere facile con le espressioni regolari) e creare un nuovo oggetto Date con valori espliciti per anno, mese, data, ora, minuto e secondo.new Date(dateString)Date.parse()


1
Date.parse è la soluzione migliore! Analizza quasi tutto! +1
ianaz,

7
@ianaz: QUASI tutto usato in America, ma manca il formato usato da gran parte dell'Europa è "quasi" troppo grande. Ma la nuova data è una buona base per le funzioni personalizzate.
Pavel V.,

new Date (dateString) ha funzionato bene per me, Date.parse () invece si converte in millisecondi e quindi restituisce un numero non un tipo di data.
Reagan Ochora,

68

@Christoph Menzioni usando una regex per affrontare il problema. Ecco cosa sto usando:

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

Non è affatto intelligente, basta configurare regex e new Date(blah)soddisfare le tue esigenze.

Modifica: forse un po 'più comprensibile in ES6 usando la destrutturazione:

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

Ma in tutta onestà in questi giorni cerco qualcosa come Moment


19
@ bažmegakapa invece di piangere potresti forse aver modificato la risposta e aggiunto tu stesso 'var?
OrganicPanda,

Perché stai usando la /gbandiera, solo per impostare lastIndexin 0seguito? Basta non usare una partita globale.
Ry-

1
@minitech /gEra una copia / incolla trascurata da un progetto esistente. lastindexè stato aggiunto da un editore (per combattere il \gsuppongo?). Li rimuoverò ora. Grazie per averlo sottolineato.
OrganicPanda,

1
molto bella risposta ..molto utile per me
Jethik

14

In JavaScript non esistono routine di formattazione data / ora sofisticate.

Dovrai utilizzare una libreria esterna per l'output formattato della data, "Formato data JavaScript" di Flagrant Badassery sembra molto promettente.

Per la conversione di input, sono già stati fatti diversi suggerimenti. :)


3
"devo" è relativo. Ovviamente puoi costruire la tua implementazione. :)
Tomalak,

13

Dai un'occhiata a Moment.js . È una libreria moderna e potente che compensa le funzioni dolorose della data di JavaScript (o la sua mancanza).


3
Non ho votato in negativo, ma forse sarebbe stato bello sapere esattamente quale funzione in Moment.js avrebbe dato il comportamento desiderato (per noi pigri che stiamo già usando Moment.js ma non conosciamo la particolare funzione da usare) .
Matt,

La localizzazione sembra promettente, scegli qualsiasi locale dell'Europa centrale per il formato punto. Tuttavia, non l'ho provato e il formato completo del datetime non è negli esempi che ho visto.
Pavel V.

Non ho votato in negativo, ma volevo solo dire che è lento. Per desktop ok, ma per dispositivi mobili potrebbe essere troppo lento (a seconda delle esigenze).
gabn88,

11

Solo per una risposta aggiornata qui, c'è una buona js lib su http://www.datejs.com/

Datejs è una libreria di date JavaScript open source per l'analisi, la formattazione e l'elaborazione.


Esegui il rollback di quella modifica, anche se molto utile, dovrebbe essere aggiunto come commento o risposta separata.
Alexis Abril,

Era comunque troppo lungo per un commento e l'aggiunta di una risposta duplicata è errata. Questa domanda ha oltre 155.000 visualizzazioni: diamo a queste persone quante più informazioni possibili! (a proposito - è molto comune in Stack Overflow modificare una risposta esistente - probabilmente ti sentiresti peggio se avessi appena copiato la tua risposta ...)
Kobi

1
E comunque, se non ti piace la mia modifica che va bene, ma per favore espandi la tua risposta - "Solo per una risposta aggiornata qui" è un riempimento e mancano alcuni dettagli. Al momento, questa domanda sta attirando l' attenzione , motivo per cui improvvisamente hai ottenuto 5 voti.
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

La libreria esterna è un problema per l'analisi di una o due date, quindi ho fatto la mia funzione usando le soluzioni di Oli e Christoph . Qui in Europa centrale usiamo raramente tutto tranne il formato del PO, quindi questo dovrebbe essere sufficiente per le semplici app utilizzate qui.

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() è abbastanza intelligente ma non posso garantire che il formato verrà analizzato correttamente.

In caso contrario, dovresti trovare qualcosa per colmare i due. Il tuo esempio è piuttosto semplice (essendo puramente numeri), quindi un tocco di REGEX (o anche string.split()- potrebbe essere più veloce) abbinato ad alcuni parseInt()ti permetterà di fissare rapidamente una data.


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

più 1 dopo aver chiamato la funzione getmonth () sembra sbagliato
Arjunsingh

t.getMonth () + 1 è corretto poiché Date.getMonth () restituisce un valore basato su 0.
Jussi Palo,

3

Solo per dare i miei 5 centesimi.

Il formato della mia data è gg.mm.aaaa (formato Regno Unito) e nessuno degli esempi precedenti ha funzionato per me. Tutti i parser stavano considerando mm come giorno e gg come mese.

Ho trovato questa libreria: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ e ha funzionato, perché puoi dire l'ordine dei campi in questo modo:

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

Spero che aiuti qualcuno.


Link ora morti!

Bene ... un breve archivio.org ha mostrato: bitbucket.org/mazzarelli/js-date/downloads è l'URL del progetto.
Anton Valqk,

1

Moment.js gestirà questo:

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

1
Mentre moment.js è eccezionale, ci sono molti casi d'uso in cui devi solo usare Javascript nativo. Il mio caso d'uso attuale è una funzione Mappa in CouchDB
Zach Smith,

1

È possibile utilizzare la libreria moment.js per questo. Sto usando solo per ottenere un output specifico per il tempo ma è possibile selezionare il tipo di formato che si desidera selezionare.

Riferimento:

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

2. funzioni specifiche di data e ora: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

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

e puoi chiamare questo metodo come:

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

Spero possa essere d'aiuto. Goditi la programmazione.


0

Per soddisfare pienamente la stringa di conversione Date.parse nel formato gg-mm-AAAA come specificato in RFC822, se si utilizza l'analisi yyyy-mm-gg, è possibile che si verifichino errori.


Cordiali saluti, da RFC 822 (pagina: 25. Parzialmente pulito per rispettare la lunghezza del testo per il commento): 13 agosto 1982 - 25 - RFC # 822 5. SPECIFICHE DI DATA E ORA 5.1. SYNTAX date-time = [day ","] data ora; gg mm aa hh: mm: ss zzz day = "Mon" / "Mar" / "Mer" / "Gio" / "Ven" / "Sab" / "Sole" data = 1 * 2DIGIT mese 2DIGIT; giorno mese anno es. 20 giu 82 mese = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / " 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;
    }

Il richiedente ha chiesto di specificare una stringa di formato .
Armali,

@Armali Parametro di input come "/ Date (1552415400000) /" in formato stringa
Abhishek Kanrar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.