2012-04-16 180 views
12

这似乎是一个非常简单的问题,但我似乎无法得到它的答案。我如何转换ISO时间戳以显示使用JavaScript的日期/时间?使用JavaScript将ISO时间戳转换为日期格式?

例时间戳:2012-04-15T18:06:08-07:00

任何帮助表示赞赏,谷歌没有我。谢谢。

+0

可能DUP http://stackoverflow.com/questions/847185/convert-a-unix-timestamp-to- time-in-javascript – elclanrs 2012-04-16 21:04:48

+5

unix时间戳和iso时间戳不一样,所以不,它不是重复的。 – Ian 2012-04-16 21:06:00

+0

你的ISO时间戳是否有字符串?并且你想把它解析成一个JavaScript'Date()'类? – jfriend00 2012-04-16 21:06:59

回答

27

将它传递给Date构造函数。

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

有关日期的更多信息,请检查https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date

+1

那么这比我想象的要容易得多......谢谢 – Ian 2012-04-16 21:16:20

+6

这似乎不适用于IE9之前的任何版本的IE或Firefox 4之前的Firefox版本。 – jfriend00 2012-04-16 21:27:00

+1

事实上,解析ISO日期是支持EcmaScript 5的一部分。如果您需要使用旧版浏览器,最好使用类似下面的代码。 – eagleflo 2012-04-16 21:50:11

4

的JavaScript(在一些最新的浏览器v1.85或更高)的最新版本可以处理ISO直接日期,以便你可以直接通过您的字符串为Date()构造是这样的:

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

但是旧版浏览器(IE9之前的任何版本的IE,任何版本的Firefox 4之前的版本等)都不支持这一点。对于这些浏览器,你可以得到,可以为你喜欢datejs这样做或自己解析它像这样的库:

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

工作演示在这里:http://jsfiddle.net/jfriend00/QSgn6/

+0

其不适用于此字符串'2012-04-15T18:06:08-07:00' – 2012-05-29 00:25:37

+0

2012-05-28T02:47:59Z – 2012-05-29 00:27:06

0

这是我见过所以最好远即能使用客户端的桌面时区并改变实时与时区设置:

<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> 
相关问题