2013-01-09 6 views
9

otrzymam od usługa String z datą w tym formacie:Konwersja yyyy-MM-DDTgg: mm: ss.fffZ do DateTime w JavaScript ręcznie

yyyy-MM-ddTHH:mm:ss.fffZ 

muszę przekonwertować string z JavaScript do normalny DateTime, ale bez używania nowego Date('yyyy-MM-ddTHH:mm:ss.fffZ'), ponieważ używam starej wersji JavaScript, która nie obsługuje tej konwersji. Mogę podzielić ten ciąg i uzyskać:

  • Rok
  • Miesiąc
  • Dni
  • Czas

ale jak manipulować strefę czasową "fffZ" Wszelkie sugestie?

+1

Jaki jest Twój javascript środowisko? –

+3

'fffZ' nie jest strefą czasową - strefa czasowa to' Z' ([czas Zulu] (http://en.wikipedia.org/wiki/Zulu_time), co oznacza UTC), a 'fff' to trzy miejsca dziesiętne które należą do części sekund ('ss.fff') - jeśli weźmiesz wszystkie trzy razem, tworzą część milisekund. – MvanGeest

+0

Android 2.3 (przy użyciu PhoneGap i ChildBrowser) –

Odpowiedz

5

mam założony rozwiązanie. Proszę sprawdzić 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

i jak tego używasz? 'Date.setISO8601 ('2010-01-02T00: 00: 01')' w ten sposób? – Bellash

0

Jeśli wiesz, że będzie to ta forma (ISO 8601, wiki), możesz analizować za pomocą metod RegExp lub string. Oto przykład RegExp, który pozwala używać timezone Z, +hh lub +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

Tęskniłeś za 28 dni ... – kennebec

+1

@kennebec Nie przegapiłem tego, po prostu nie udało mi się skopiować właściwa rzecz: –

10

Oto jedna wkładka z John Resig:

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

'nowa data (" 1987/02/28 23: 11: 81.333 ")' daje mi 'Nieprawidłowa data' –

+3

Myślę, że ta odpowiedź musi być wyjaśniona, ponieważ potrzebuje przykładu i kończy się przecinkiem –

-2

momentjs ma odpowiedź na to i wiele innych problemów daty można mieć. Podczas gdy nie jest jasne, gdzie i jak będziesz potrzebować potrzebnej daty, żaden z pożądanych formatów, myślę, że momentjs nie może dostarczyć Ci niektórych potrzebnych zadań. Dodałbym moduł do mojego rozwiązania i używałbym go (poniżej jest analizowany. com kod chmura):

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

wyjściowa:

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

prawo .... Byłem zbyt szybki, odpowiadając na to. Z pewnością momentjs może ci bardzo pomóc .. ale rrrr-MM-ddTHH: mm: ss.fffZ nie jest w pełni zrewidowany. coś wspólnego z częścią Fff .... ale moim głównym celem jest to, że używając timejsów możesz pokonać wiele problemów. – Chasky