javascript – 从ISO8601时间戳创建另一个格式化日期字符串

var date = '2014-02-02T20:10:00';
console.log(date);

为什么会返回以下内容?:

‘2014-02-02T20:10:00’ //ok

但:

var date = new Date(date);
console.log(date);

收益:

Sun Feb 02 2014 21:10:00 GMT+0100 //bad

我想收到以下内容,其中没有偏移:

Sun Feb 02 2014 20:10:00 GMT

我怎么能这样做?

你不能正确地依赖Dateparse一个字符串(here is a comparison和ISO8601解析引入之前的那个 – ECMA5)到一个Date对象,所以对于跨浏览器,最好自己动手.您也不能依赖于从Date.toString()返回的字符串,并且对于跨浏览器,您需要自己格式化,或者使用像moments.js这样的库.就这么简单.

您拥有的字符串是ISO8601格式的日期戳,具体而言,根据ISO8601规范,假定为本地时间,因为没有提供偏移,我将假设它是UTC.许多浏览器和库,W3C和ECMA5 spec(具有改变假设的勘误表)对此持不同意见,你不能理所当然地假定当地时间.

你显然有一个支持这些字符串的浏览器.但是当你输出Date.toString时,你要求当地时间(根据你的环境),但是你想要UTC(假设),所以你需要Date.toUTCString(),但这些方法是依赖于实现的,你可能在不同的环境中得不到相同的字符串.

使用Javascript

function parseMyDateString(str) {
    var parts = str.split(/[\-T:]/);

    parts[1] -= 1;

    return new Date(Date.UTC.apply(undefined, parts));
}

function padLeft(arg) {
    var str = String(arg);

    if (str.length < 2) {
        str = '0' + str;
    }

    return str;
}

function formatMyDateString(date) {
    var days = [
            'Sun',
            'Mon',
            'Tue',
            'Wed',
            'Thu',
            'Fri',
            'Sat'
        ],
        months = [
            'Jan',
            'Feb',
            'Mar',
            'Apr',
            'May',
            'Jun',
            'Jul',
            'Aug',
            'Sep',
            'Oct',
            'Nov',
            'Dec'
        ],
        dateString = [
            days[date.getUTCDay()],
            months[date.getUTCMonth()],
            padLeft(date.getUTCDate()),
            date.getUTCFullYear()
        ].join(' '),
        timeString = [
            padLeft(date.getUTCHours()),
            padLeft(date.getUTCMinutes()),
            padLeft(date.getUTCSeconds())
        ].join(':');

    return [
            dateString,
            timeString,
            'GMT'
        ].join(' ');
}

var iso8601String = '2014-02-02T20:10:00',
    dateObject = parseMyDateString(iso8601String),
    myDateString = formatMyDateString(dateObject);

console.log(myDateString);

产量

Sun Feb 02 2014 20:10:00 GMT 

jsFiddle

https://stackoverflow.com/questions/21516995/create-another-formated-date-string-from-an-iso8601-timestamp

转载注明原文:javascript – 从ISO8601时间戳创建另一个格式化日期字符串