2009-01-31 12 views
20

Ho cercato di convertire un valore di data in un formato più leggibile. Per fare ciò, sto cercando di analizzare la data utilizzando il metodo JavaScript Date.parse(). Che tuttavia non funziona sull'input (ad esempio: "2007-09-21T14:15:34.058-07:00") che ho. L'obiettivo finale è di produrre una stringa di date come "January 30th, 2008 @ 2:15PM".Come posso convertire un valore di data nel formato ISO 8601 in un oggetto data in JavaScript?

Qualche idea?

+0

UTC è il fuso orario 00:00. Intendi il formato ISO 8601? – some

risposta

12

Prova http://www.datejs.com/. Si tratta di una libreria di date JavaScript con un metodo Date.parse esteso e un metodo Date.parseExact, che consente di specificare una stringa di formato. Vedere DateJS APIDocumentation.

+2

Vale la pena sottolineare che non sembra perfetto e lo sviluppo sembra essersi fermato. Esempio con il file britannico: 'console.log (Date.parse ('1997-07-16T19: 20: 30 + 01: 00'));' restituisce null, e se la parte del fuso orario viene rimossa, funziona, ma nel Formato americano (mercoledì 16 luglio 1997 19:20:30 GMT + 0100 (BST)), mentre "Mer 16 luglio 1997 ..." sarebbe stato un po 'più britannico. – user535673

20

Probabilmente si dovrebbe utilizzare il datejs che f3lix raccomanda, però mi annoiavo e gettò insieme un piccolo oggetto che fa esattamente quello che hai chiesto:

25 settembre 2012: il codice Puliti, consentirà formato non esteso , ad es. 20120925T164740 + 0200

1 ° dicembre 2011: corretto un bug nella stringa del mese. Agosto mancava

var ISODate = { 
    convert : 
    function (input){ 
     if (!(typeof input === "string")) throw "ISODate, convert: input must be a string"; 
     var d = input.match(/^(\d{4})-?(\d{2})-?(\d{2})[T ](\d{2}):?(\d{2}):?(\d{2})(\.\d+)?(Z|(?:([+-])(\d{2}):?(\d{2})))$/i); 
     if (!d) throw "ISODate, convert: Illegal format"; 
     return new Date(
     Date.UTC(
      d[1], d[2]-1, d[3], 
      d[4], d[5], d[6], d[7] || 0 % 1 * 1000 | 0 
     ) + (
      d[8].toUpperCase() === "Z" ? 0 : 
      (d[10]*3600 + d[11]*60) * (d[9] === "-" ? 1000 : -1000) 
     ) 
    ); 
    }, 
    format : 
    function(date, utc){ 
     if (typeof date === "string") date = this.convert(date); 
     if (!(date instanceof Date)) throw "ISODate, format: t is not a date object"; 

     var t={'FullYear':0, 'Month':0, 'Date':0, 'Hours':0, 'Minutes':0, 'Seconds':0}; 
     for (var key in t) { 
     if (t.hasOwnProperty(key)) t[key] = date["get" +(utc ? "UTC" :"") + key]() 
     } 

     return this.month[t.Month] 
     + " " 
     + this.ordinal(t.Date) 
     + ", " 
     + t.FullYear 
     + " @ " 
     + this.clock12(t.Hours,t.Minutes); 
     }, 
    month: 
    [ 
     "January", "February", "March", "April", "May", "June", 
     "July", "August", "September", "October", "November", "December" 
    ], 
    ordinal: 
    function(n) { 
     return n+(
     [ 
      "th", "st", "nd", "rd" 
     ][ 
      ((n % 100/10) | 0) === 1 ? 0 : n % 10 < 4 ? n % 10 : 0 
     ] 
    ); 
    }, 
    clock12: 
    function(h24, m, s){ 
     h24%=24; 
     var h12 = (h24 % 12) || 12; 
     return h12 + ":" + 
     (m < 10 ? "0" + m : m) + 
     (isFinite(s) ? ":" + (s < 10 ? "0" + s : s) : "") + 
     (h24 < 12 ? "AM" : "PM"); 
     } 
}; 

Esempio:

//Shows the date in the users timezone: 
alert(ISODate.format("2007-09-21T14:15:34.058-07:00")); 

//Show the date in UTC (Timezone Z, 00:00) 
alert(ISODate.format("2007-09-21T14:15:34.058-07:00",true)); 

Spiegazione:

convertito prende una stringa come input e restituisce un oggetto data in caso di successo o genera un'eccezione in caso contrario. La stringa deve essere in uno dei seguenti formati:

  • AAAA-MM-GGThh: mm: ss.sZ
  • AAAA-MM-GGThh: mm: ss.sXaa: bb

dove:

  • AAAA è l'anno come numero intero di 4 cifre
  • MM è il mese come numero intero 2 cifre
  • DD è il dat e di mese come un numero intero 2 cifre
  • T è la T carattere o spazio (\ x20)
  • hh è l'ora in formato 24 ore, come un numero intero 2 cifre
  • mm è il minuto come 2 cifre intero
  • ss.s è il secondo, o come numero intero a 2 cifre o come virgola mobile a 2 cifre seguito da un periodo seguito da una o più cifre.
  • Z è il carattere Z (che indica Z fuso orario, GMT + 00: 00)
  • X è un segno più (+) o meno (-) segno del timeOffset a UTC
  • aa è l'ora di timeOffset a UTC come un intero 2 cifre
  • bb è minuto di timeOffset ITC come un intero 2 cifre

formato prende una stringa nel formato sopra o una data-oggetto e restituisce una stringa formattati come :

  • MD, Y @ h: mm

Dove - M è il nome inglese completa del mese - D è la data di mese con un suffisso ordine numerico (1-2 cifre) - Y è l'anno (1 o più cifre) - h è l'ora in formato 12 ore (1-2 cifre) - m è minuto (2 cifre)

mese è un array con il nome mesi

ordinale è una funzione che accetta un numero come input e restituisce il numero con il suffisso ordinale inglese.

clock12 è una funzione che richiede ora, minuti e secondi in formato 24 ore e la converte in una stringa nel formato USA 12h. Il secondi è facoltativo.

+0

Questa risposta è stata molto istruttiva, ma la prima che penso è più potente. – midas06

+0

Sono d'accordo che datejs è più potente e capisco che tu abbia selezionato quella risposta. – some

+0

datejs è più potente ma ha un'impronta. Se la conversione di cui sopra è tutto ciò che devi fare, usalo. Ma c'è un piccolo bug - scambia "this.month [t [1] -1]" invece di "this.month [t [1]]" nel formato: metodo. – jschrab

Problemi correlati