2013-01-09 10 views
9

Ricevo da un webservice una stringa con una data in questo formato:Convert AAAA-MM-AAAAThh: mm: ss.fffZ a DateTime in JavaScript manualmente

yyyy-MM-ddTHH:mm:ss.fffZ 

Ho bisogno di convertire tale stringa con Javascript per un normale DateTime ma senza utilizzare il nuovo Date('yyyy-MM-ddTHH:mm:ss.fffZ') perché sto utilizzando una vecchia versione di JavaScript che non supporta tale conversione. Posso dividere la stringa e ottenere il:

  • Anno
  • Mese
  • Giorni
  • Tempo

ma come manipolare il fuso orario "fffZ" Qualche suggerimento?

+1

Qual è il tuo ambiente javascript? –

+3

'fffZ' non è un fuso orario - il fuso orario è' Z' ([Zulu time] (http://en.wikipedia.org/wiki/Zulu_time), che significa UTC), e 'fff' sono tre decimali appartengono alla parte dei secondi ('ss.fff') - se prendi tutti e tre insieme, formano la parte dei millisecondi. – MvanGeest

+0

Android 2.3 (Uso PhoneGap e ChildBrowser) –

risposta

5

ho fondato la soluzione. Si prega di verificare http://webcloud.se/log/JavaScript-and-ISO-8601/

Date.prototype.setISO8601 = function (string) { 
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + 
     "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" + 
     "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?"; 
    var d = string.match(new RegExp(regexp)); 

    var offset = 0; 
    var date = new Date(d[1], 0, 1); 

    if (d[3]) { date.setMonth(d[3] - 1); } 
    if (d[5]) { date.setDate(d[5]); } 
    if (d[7]) { date.setHours(d[7]); } 
    if (d[8]) { date.setMinutes(d[8]); } 
    if (d[10]) { date.setSeconds(d[10]); } 
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); } 
    if (d[14]) { 
     offset = (Number(d[16]) * 60) + Number(d[17]); 
     offset *= ((d[15] == '-') ? 1 : -1); 
    } 

    offset -= date.getTimezoneOffset(); 
    time = (Number(date) + (offset * 60 * 1000)); 
    this.setTime(Number(time)); 
} 
+0

e come lo usi? 'Date.setISO8601 ('2010-01-02T00: 00: 01')' in questo modo? – Bellash

0

Se si sa che sarà di questo modulo (ISO 8601, wiki), è possibile analizzare con RegExp o metodi di stringa. Ecco un esempio RegExp che ti consente di utilizzare il fuso orario Z, +hh o +hh:mm.

var dateString = '2013-01-08T17:16:36.000Z'; 

var ISO_8601_re = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{3}))?(Z|[\+-]\d{2}(?::\d{2})?)$/, 
    m = dateString .match(ISO_8601_re); 

var year = +m[1], 
    month = +m[2], 
    dayOfMonth = +m[3], 
    hour = +m[4], 
    minute = +m[5], 
    second = +m[6], 
    ms = +m[7], // +'' === 0 
    timezone = m[8]; 

if (timezone === 'Z') timezone = 0; 
else timezone = timezone.split(':'), timezone = +(timezone[0][0]+'1') * (60*(+timezone[0].slice(1)) + (+timezone[1] || 0)); 
// timezone is now minutes 

// your prefered way to construct 
var myDate = new Date(); 
myDate.setUTCFullYear(year); 
myDate.setUTCMonth(month - 1); 
myDate.setUTCDate(dayOfMonth); 
myDate.setUTCHours(hour); 
myDate.setUTCMinutes(minute + timezone); // timezone offset set here, after hours 
myDate.setUTCSeconds(second); 
myDate.setUTCMilliseconds(ms); 

console.log(myDate); // Tue Jan 08 2013 17:16:36 GMT+0000 (GMT Standard Time) 
+0

Ti sei perso da 28 giorni ... – kennebec

+1

@kennebec Non mi sono perso, ho appena fallito a copiare la cosa giusta –

10

Ecco un uno di linea da John Resig:

var date = new Date((time || "").replace(/-/g,"/").replace(/[TZ]/g," ")), 
+0

'new Date (" 1987/02/28 23: 11: 81.333 ")' mi dà 'Data non valida' –

+3

Penso che questa risposta deve essere spiegata in quanto necessita di un esempio e termina con una virgola –

-2

momentjs ha la risposta a questo e molti altri problemi di data che potreste avere. Mentre non è chiaro dove e come userete la data necessaria, né il formato desiderato, penso che momentjs possa darvi alcune delle attività necessarie Vorrei aggiungere il modulo alla mia soluzione e usarlo come (di seguito è riportato il parsing. com codice cloud):

Parse.Cloud.define("momentFormat", function(request, response){ 
    var message; 

    var date = momento('2013-01-08T17:16:36.000Z'); 
    response.success("original format date: " + date.format("YYYY-MM-DDTHH:mm:ss.SSSZ") + " new format date: " + date.format("dddd, MMMM Do YYYY, h:mm:ss a")); 
}); 

uscita:

{"result":"original format date: 2013-01-08T17:16:36.000+00:00 new format date: Tuesday, January 8th 2013, 5:16:36 pm"} 
+0

giusto .... Ero troppo veloce nel rispondere a questo. Per certo, i momenti possono aiutarti molto ... ma yyyy-MM-ddTHH: mm: ss.fffZ non è completamente riconciliato. qualcosa a che fare con la parte fff .... ma il mio punto principale è che usando momentjs puoi superare molti problemi. – Chasky