2009-01-24 17 views
182

Come posso convertire una stringa in un oggetto di data ora in javascript specificando una stringa di formato?Come posso convertire la stringa in datetime con la specifica del formato in JavaScript?

Sto cercando qualcosa di simile:

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

BTW punti e trattini può non come separatori di data, le barre sono a posto, quindi (ai limiti del mio test) Javascript accetteranno "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. –

+0

La funzione Date.parse analizza la stringa della data che si trova nel formato "mm/gg/aaaa". Si prega di convertire la stringa in formato "mm/gg/aaaa" prima di applicare Parse. –

+0

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

risposta

88

penso che questo può aiutare: http://www.mattkruse.com/javascript/date/

C'è una funzione getDateFromFormat() che è possibile modificare un po 'per risolvere il problema.

Update: c'è una versione aggiornata dei campioni disponibili a javascripttoolbox.com

+5

'TypeError: Object Date non ha alcun metodo 'getDateFromFormat'' –

+4

Il metodo getDateFromFormat è disponibile con il documento, nel link sopra. Fonte disponibile qui: http://www.mattkruse.com/javascript/date/source.html –

+1

+1, buona libreria..pure javascript ... è fantastico. grazie –

81

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

+1

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

+5

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

+0

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

3

Date.parse() è abbastanza intelligente, ma non posso garantire che il formato sarà analizzare correttamente.

Se così non fosse, dovresti trovare qualcosa per collegare i due. Il tuo esempio è piuttosto semplice (essendo puramente numeri) quindi un tocco di REGEX (o anche string.split() - potrebbe essere più veloce) in coppia con alcuni parseInt() ti permetterà di fare velocemente una data.

14

Nessuna routine di formattazione data/ora sofisticata esiste in JavaScript.

Dovrai utilizzare una libreria esterna per l'output di data formattata, "JavaScript Date Format" da Flagrant Badassery sembra molto promettente.

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

+3

"deve" è relativo. Naturalmente puoi costruire la tua implementazione. :) – Tomalak

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

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

+0

Ripristinato quella modifica, anche se molto utile dovrebbe essere aggiunto come commento o risposta separata. –

+0

In ogni caso era 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 ho appena copiato la tua risposta ...) – Kobi

+0

E comunque, se non ti piace la mia modifica va bene, ma per favore espandi la tua risposta - "Solo per una risposta aggiornata qui" è un riempitivo, e mancano alcuni dettagli. Questa domanda sta ricevendo [qualche attenzione] (http://meta.stackexchange.com/questions/145301/what-can-be-done-with-a-blatantly-wrong-answer-to-a-popular-question) a il momento, a proposito, che è la ragione per cui hai improvvisamente ottenuto 5 voti. – Kobi

55

@Christoph Menzioni utilizzando un'espressione regolare per affrontare il problema. Ecco quello che 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]) 
); 

E 'in alcun modo intelligente, basta configurare la regex e new Date(blah) base alle proprie esigenze.

Edit: Forse un po 'più comprensibile in ES6 utilizzando 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à questi giorni ho raggiungere per qualcosa come Moment

+17

@ bažmegakapa invece di piangere potresti forse aver modificato la risposta e aggiunto il 'var' te stesso? – OrganicPanda

+2

Devo ammettere che hai ragione. Btw, downvot rimosso. – kapa

+0

Perché stai usando il flag '/ g', solo per impostare' lastIndex' su '0' dopo? Basta non usare una corrispondenza globale. – Ryan

0

di soddisfare pienamente la stringa convertito Date.parse per formattare gg-mm-AAAA come specificato in RFC822, se si utilizza yyyy-mm-dd parse può fare un errore.

+0

FYI, da RFC 822 (pagina: 25. Parzialmente pulito per soddisfare la lunghezza del testo per un commento): 13 agosto 1982 - 25 - RFC# 822 5. DATA E TEMPO DI SPECIFICA 5.1.SYNTAX data-ora = [giorno ""] data e ora; gg mm aa hh: mm: ss zzz giorno = "Mon"/"mar"/"Mer"/"Gio"/"Ven"/"Sat"/"Sun" date = 1 * 2DIGIT mese 2DIGIT; giorno mese anno per es. 20 Giugno 82 mese = "Jan"/"Febbraio"/"Mar"/"Aprile"/"Maggio"/"Jun"/"luglio"/"Aug"/"Settembre"/"Oct"/"Novembre"/"Dec" –

2

Solo per dare i miei 5 centesimi.

Il mio formato data è gg.mm.aaaa (formato Regno Unito) e nessuno degli esempi sopra ha funzionato per me. Tutti i parser consideravano mm come giorno e dd come mese.

ho trovato questa libreria: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ e ha funzionato, perché si può dire che l'ordine dei campi come questo:

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

Mi auguro che aiuta qualcuno.

+0

Link ora morti! –

+0

Beh ... una rapida archive.org ha mostrato: https://bitbucket.org/mazzarelli/js-date/downloads/ è l'URL del progetto. –

12

Check out Moment.js. Si tratta di una libreria moderna e potente che compensa le funzioni Date (o la mancanza) di JavaScript.

+3

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

+0

La localizzazione sembra essere molto promettente, scegliere qualsiasi locale centro-europea per il formato dot. Tuttavia, non l'ho testato e il formato datetime completo non è negli esempi che ho visto. –

+0

non ho downvote, ma volevo solo dire che questo è lento. Per il desktop ok, ma per i dispositivi mobili potrebbe essere troppo lento (a seconda delle esigenze). – gabn88

3

La libreria esterna è un overkill per l'analisi di una o due date, quindi ho creato la mia funzione utilizzando le soluzioni Oli's e Christoph's. Qui in Europa centrale usiamo raramente tutto tranne il formato dell'OP, 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])); 
    } 
} 
0

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 è fantastico, ci sono una miriade di casi d'uso in cui devi semplicemente usare Javascript nativo. Il mio attuale caso d'uso è una funzione Mappa in CouchDB –

0
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 
Problemi correlati