2012-04-16 39 views
12

Điều này có vẻ như một câu hỏi khá đơn giản nhưng tôi dường như không thể có được câu trả lời cho nó. Làm thế nào tôi có thể chuyển đổi một dấu thời gian ISO để hiển thị ngày/giờ bằng cách sử dụng JavaScript?Chuyển đổi dấu thời gian iso sang định dạng ngày bằng Javascript?

Ví dụ dấu thời gian: 2012-04-15T18: 06: 08-07: 00

Bất kỳ trợ giúp nào được đánh giá cao, Google không làm tôi thất vọng. Cảm ơn bạn.

+0

thể dup http://stackoverflow.com/questions/847185/convert-a-unix-timestamp-to- time-in-javascript – elclanrs

+5

Dấu thời gian unix và dấu thời gian iso không giống nhau, vì vậy không, nó không phải là một bản sao. – Ian

+0

Dấu thời gian ISO của bạn có chuỗi không? và bạn muốn phân tích nó thành lớp javascript Date() '? – jfriend00

Trả lời

27

Chuyển nó đến hàm tạo ngày.

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

Để biết thêm thông tin về Ngày, hãy kiểm tra https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date.

+1

Thật dễ dàng hơn nhiều so với tôi nghĩ ... nhờ – Ian

+6

Điều này dường như không hoạt động trong bất kỳ phiên bản nào của IE trước IE9 hoặc các phiên bản Firefox trước Firefox 4. – jfriend00

+1

Thật vậy, phân tích cú pháp ngày ISO là một phần của việc hỗ trợ EcmaScript 5. Nếu bạn cần làm việc với các trình duyệt cũ hơn, bạn nên sử dụng một cái gì đó giống như mã bên dưới. – eagleflo

4

Phiên bản mới nhất của javascript (v1.85 hoặc cao hơn trong một số các trình duyệt mới nhất) có thể xử lý các tiêu chuẩn ISO ngày trực tiếp vì vậy bạn chỉ có thể vượt qua chuỗi bạn trực tiếp đến constructor Date() như thế này:

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

Nhưng các trình duyệt cũ hơn (mọi phiên bản IE trước IE9, mọi phiên bản Firefox trước 4, v.v ...) đều không hỗ trợ tính năng này. Đối với những trình duyệt, bạn có thể nhận được một thư viện mà có thể làm điều này cho bạn thích datejs hoặc phân tích nó cho mình như thế này:

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

Làm việc giới thiệu ở đây: http://jsfiddle.net/jfriend00/QSgn6/

+0

không hoạt động đối với chuỗi này '2012-04-15T18: 06: 08-07: 00' –

+0

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

0

Đây là tốt nhất mà tôi đã nhìn thấy cho xa mà có thể sử dụng múi giờ máy tính để bàn của khách hàng và thay đổi theo thời gian thực với các thiết lập múi giờ:

<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> 
Các vấn đề liên quan