Javascript 使用Javascript将iso时间戳转换为日期格式?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10181649/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 00:12:04  来源:igfitidea点击:

Convert iso timestamp to date format with Javascript?

javascriptjquerydatetimestampiso

提问by Ian

This seems like a pretty simple question but I can't seem to get an answer for it. How can I convert an iso timestamp to display the date/time using JavaScript?

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

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

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

Any help is appreciated, Google is failing me. Thank you.

任何帮助表示赞赏,谷歌让我失望。谢谢你。

回答by eagleflo

Pass it to the Date constructor.

将其传递给 Date 构造函数。

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

For more information about Date, check https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date.

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

回答by jfriend00

The newest version of javascript (v1.85 or higher in some of the latest browsers) can handle the ISO dates directly so you can just pass your string directly to the Date()constructor like this:

最新版本的 javascript(在某些最新浏览器中为 v1.85 或更高版本)可以直接处理 ISO 日期,因此您可以直接将字符串传递给Date()构造函数,如下所示:

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

But older browsers (any version of IE before IE9, any version of Firefox before 4, etc...) do not support this. For those browsers, you can either get a library that can do this for you like datejsor parse it yourself like this:

但是较旧的浏览器(IE9 之前的任何版本的 IE,4 之前的任何版本的 Firefox 等)不支持此功能。对于这些浏览器,您可以获取一个可以像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);

Working demo here: http://jsfiddle.net/jfriend00/QSgn6/

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

回答by Tom G

This is the best I've seen so far that is able to use the client's desktop timezone and changes real-time with the timezone setting:

这是迄今为止我见过的最好的,它能够使用客户端的桌面时区并使用时区设置实时更改:

<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)/, ''));
    }
</script>