2012-04-16 9 views
12

Questa sembra una domanda piuttosto semplice, ma non riesco a ottenere una risposta. Come posso convertire un timestamp iso per visualizzare la data/ora usando JavaScript?Conversione di data/ora per iso con Javascript?

Esempio timestamp: 2012-04-15T18: 06: 08-07: 00

Ogni aiuto è apprezzato, Google mi sta venendo a mancare. Grazie.

+0

possibile DUP http://stackoverflow.com/questions/847185/convert-a-unix-timestamp-to- time-in-javascript – elclanrs

+5

A timestamp unix e timestamp iso non sono la stessa cosa, quindi no, non è un duplicato. – Ian

+0

La data/ora ISO è una stringa? e vuoi analizzarlo in una classe javascript 'Date()'? – jfriend00

risposta

27

Passalo al costruttore Date.

> var date = new Date('2012-04-15T18:06:08-07:00') 
> date 
    Mon Apr 16 2012 04:06:08 GMT+0300 (EEST) 

Per ulteriori informazioni su Data, selezionare https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date.

+1

Beh, è ​​stato molto più facile di quanto pensassi ... grazie – Ian

+6

Questo non sembra funzionare in nessuna versione di IE prima di IE9 o versioni di Firefox prima di Firefox 4. – jfriend00

+1

Infatti, l'analisi delle date ISO è parte del supporto di EcmaScript 5. Se hai bisogno di lavorare con i vecchi browser, è meglio usare qualcosa come il seguente codice. – eagleflo

4

La nuova versione di JavaScript (v1.85 o superiore in alcuni dei browser più recenti) in grado di gestire l'ISO le date direttamente in modo da poter passare solo la stringa direttamente al Date() costruttore in questo modo:

var jsDate = new Date("2012-04-15T18:06:08-07:00"); 

Ma i browser più vecchi (qualsiasi versione di IE prima di IE9, qualsiasi versione di Firefox prima del 4, ecc ...) non supportano questo. Per questi browser, è possibile ottenere una libreria che può fare questo per voi come datejs o analizzare voi stessi in questo modo:

var t = "2012-04-15T18:06:08-07:00"; 

function convertDate(t) { 
    var dateRE = /(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)([+\-]\d+):(\d+)/; 
    var match = t.match(dateRE); 
    var nums = [], item, date; 
    if (match) { 
     for (var i = 1; i < match.length; i++) { 
      nums.push(parseInt(match[i], 10)); 
     } 
     if (nums[7] < 0) { 
      nums[8] *= -1; 
     } 
     return(new Date(nums[0], nums[1] - 1, nums[2], nums[3] - nums[6], nums[4] - nums[7], nums[5])); 
    } 
} 

var jsDate = convertDate(t); 

lavoro demo qui: http://jsfiddle.net/jfriend00/QSgn6/

+0

non funziona per questa stringa '2012-04-15T18: 06: 08-07: 00' –

+0

2012-05-28T02: 47: 59Z –

0

Questo è il migliore che ho visto così lontano che è in grado di utilizzare fuso orario desktop del cliente e modifiche in tempo reale con l'impostazione fuso orario:

<script type="text/javascript"> 
    //Use: timeZoneConvert("2015-11-03T17:36:20.970"); 
    //Mon Nov 02 2015 17:36:20 GMT-0600 (Central Standard Time) [Date object] 

    //To format string use: timeZoneConvertFormatted("2015-11-03T17:36:20.970") 
    //November 2, 2015 5:36 PM 

    //Works even when I change client timezone to Pacific Standard 
    //Mon Nov 02 2015 15:36:20 GMT-0800 (Pacific Standard Time) 



var months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; 
function timeZoneConvert(dateStr) { 
    var d = parse_iso8601(dateStr); 
    //Change (- 360) constant for your server, mine is Central Standard 
    var dTimezoneOffset = new Date(d.getTime() - ((new Date()).getTimezoneOffset() - 360)*60000); 
    return dTimezoneOffset; 
} 

function timeZoneConvertFormatted(dateStr) { 
    return fDateTime(timeZoneConvert(dateStr)); 
} 


function fDateTime(date1) { 
    var date = date1.getDate(); 
    var year = date1.getFullYear(); 
    var month = months[date1.getMonth() + 1]; 
    var h = date1.getHours(); 
    var m = date1.getMinutes(); 
    var ampm = "AM"; 
    if(m < 10) { 
     m = "0" + m; 
    } 
    if(h > 12) { 
     h = h - 12; 
     var ampm = "PM"; 
    } 
    return month + " " + date + ", " + year + " " + h + ":" + m + " " + ampm; 
} 



    var iso8601extended = /^\d{4}(-\d{2}(-\d{2}([T ]\d{2}(:\d{2}(:\d{2})?)?([,.]\d+)?(Z|[+-]\d{2}(:\d{2})?)?)?)?)?$/; 
    var iso8601basic = new RegExp(iso8601extended.source.replace(/[:-]\\d/g, '\\d')); 
    var firstNumber = /[^\d]*(\d+)/g; 
    function parse_iso8601(s) { 
     s = s.replace(/,/g, '.'); 
     var matches = iso8601extended.exec(s); 
     if (matches) { 
      s = s.substr(0, 10).replace(/-/g, '') + s.substr(10).replace(/:/g, ''); 
     } 
     matches = iso8601basic.exec(s); 
     if (!matches) { 
      return null; 
     } 
     var d = new Date(); 
     d.setUTCFullYear(toNumber(matches[0].substring(0, 4))); 
     d.setUTCMonth(matches[1] ? toNumber(matches[1].substr(0, 2)) - 1 : 0); 
     d.setUTCDate(matches[2] ? toNumber(matches[2].substr(0, 2)) : 1); 
     var hours = 0, minutes = 0, seconds = 0, milliseconds = 0; 
     var fraction = matches[6] ? parseFloat(matches[6]) : 0; 
     if (matches[3]) { 
      hours = toNumber(matches[3].substr(1, 2)); 
      if (matches[4]) { 
       minutes = toNumber(matches[4].substr(0, 2)); 
       if (matches[5]) { 
        seconds = toNumber(matches[5].substr(0, 2)); 
        milliseconds = 1000 * fraction; 
       } else { 
        seconds = 60 * fraction; 
       } 
      } else { 
       minutes = 60 * fraction; 
      } 
     } 
     if (!matches[7]) { 
      d.setHours(hours); 
      d.setMinutes(minutes); 
     } else { 
      d.setUTCHours(hours); 
      d.setUTCMinutes(minutes); 
     } 
     d.setUTCSeconds(seconds); 
     d.setUTCMilliseconds(milliseconds); 
     if (matches[7] && matches[7] != 'Z') { 
      offset = toNumber(matches[7].substr(1, 2)) * 60; 
      if (matches[8]) { 
       offset += toNumber(matches[8].substr(0, 2)); 
      } 
      d.setTime(d.getTime() + 60000 * offset * (matches[7].substr(0, 1) == '-' ? 1 : -1)); 
     } 
     return d; 
    } 
    function toNumber(s) { 
     return parseInt(s.replace(/^0+(\d)/, '$1')); 
    } 
</script> 
Problemi correlati