从ISO 8601时间戳创建另一个格式化的日期字符串

时间:2014-02-02 22:17:53

标签: javascript date date-format

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

我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

您不能正确地将Date parse字符串(here is a comparison并且在引入ISO8601解析之前 - ECMA5)依赖于Date对象,因此对于跨浏览器最好自己动手。您也不能依赖从Date.toString()返回的字符串,并且对于跨浏览器,您需要自己格式化,或使用像moments.js这样的库。就这么简单。

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

你显然有一个支持这些字符串的浏览器。但是当你输出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

答案 1 :(得分:-1)

问题是时区调整,以下是另外一行代码来解决您的问题:

var date = '2014-02-02T20:10:00'; console.log(date);
var date = new Date(date);
date.setHours(date.getHours() + (date.getTimezoneOffset()/60));
console.log(date);

这是a working code sample

答案 2 :(得分:-2)

W3 Schools上查看此帖子。它遍历日期对象。您可以使用几种不同的方法来获取您正在寻找的日期格式。