2012-04-16 18 views
12

Esto parece una pregunta bastante simple, pero parece que no puedo obtener una respuesta. ¿Cómo puedo convertir una marca de tiempo iso para mostrar la fecha/hora usando JavaScript?¿Convierte el formato de fecha y hora de iso a fecha con Javascript?

Ejemplo de marca de tiempo: 2012-04-15T18: 06: 08-07: 00

se aprecia Cualquier ayuda, Google me está fallando. Gracias.

+0

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

+5

Una marca de tiempo y marca de tiempo iso no son lo mismo, entonces no, no es un duplicado. – Ian

+0

¿Su marca de tiempo ISO tiene una cadena? y quieres analizarlo en una clase 'Date()' de JavaScript? – jfriend00

Respuesta

27

Pásalo al constructor de fecha.

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

Para obtener más información acerca de la fecha, comprobar https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date.

+1

Bueno, eso fue significativamente más fácil de lo que pensaba ... gracias – Ian

+6

Esto no parece funcionar en ninguna versión de IE antes de IE9 o versiones de Firefox antes que Firefox 4. – jfriend00

+1

De hecho, analizar las fechas ISO es parte de la compatibilidad con EcmaScript 5. Si necesita trabajar con navegadores más antiguos, es mejor que utilice algo como el siguiente código. – eagleflo

4

La nueva versión de Javascript (v1.85 o superior en algunos de los navegadores más recientes) puede manejar la ISO data directamente por lo que sólo puede pasar su cadena directamente a la Date() constructor de la siguiente manera:

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

Pero los navegadores más antiguos (cualquier versión de IE antes de IE9, cualquier versión de Firefox anterior a 4, etc ...) no son compatibles. Para estos navegadores, puede obtener una biblioteca que puede hacer esto para usted como datejs o analizar por sí mismo de esta manera:

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

trabajo de demostración aquí: http://jsfiddle.net/jfriend00/QSgn6/

+0

no funciona para esta cadena '2012-04-15T18: 06: 08-07: 00' –

+0

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

0

Ésta es la mejor que he visto hasta ahora que es capaz de utilizar la zona horaria de escritorio del cliente y los cambios en tiempo real con la configuración de zona horaria:

<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> 
Cuestiones relacionadas