【问题标题】:Create another formated date string from an ISO8601 timestamp从 ISO 8601 时间戳创建另一个格式化的日期字符串
【发布时间】:2014-02-02 22:17:53
【问题描述】:
var date = '2014-02-02T20:10:00';
console.log(date);

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

'2014-02-02T20:10:00' //好的

但是:

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

返回:

2014 年 2 月 2 日星期日 21:10:00 GMT+0100 //不好

我想收到以下,没有偏移:

格林威治标准时间 2014 年 2 月 2 日星期日 20:10:00

我怎样才能做到这一点?

【问题讨论】:

  • 你不会是指Sun Feb 02 2014 20:10:00 GMT +0000吧?
  • 我想收到不添加 +1 小时的对象
  • 由于日期字符串不包含时区偏移量,因此假定日期为 UTC。如果您使用'2014-02-02T20:10:00+0100',它应该可以正常工作。 This question 说明了在任何情况下都可以这样做的另一个原因。
  • 在第一个代码 sn-p 中,您在控制台中打印一个字符串对象,而在第二个代码 sn-p 中,您打印一个转换为字符串的 Date 对象。 @AndyNovocin 提供了一些很好的链接,我还建议检查 date.js 插件 datejs.com
  • @Felix Kling 根据 ISO8601:2004 规范,假定这种没有偏移的时间戳是本地的,而不是 UTC。 ECMA5 规范中添加了勘误表,后来使其与 ISO 保持一致。所以一些浏览器实现做一件事和另一件事。我自己才刚刚发现这一点,需要回顾一些答案并纠正我的假设(来自阅读)。

标签: javascript date date-format


【解决方案1】:

你不能正确地依赖Dateparse 一个字符串(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

【讨论】:

    【解决方案2】:

    问题是时区调整,下面有一行代码可以解决您的问题:

    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

    【讨论】:

    • 这只会产生更多问题,您应该使用 UTC 解决它,而不是更改本地时间。
    • 我很抱歉,似乎 ISO 标准假定本地时间而不是 UTC,因此在这种情况下,这可能是一个有效的修复,取决于浏览器的实现,由于 ECMA5 中的勘误表规格。
    【解决方案3】:

    查看W3 Schools 上的这篇帖子。它越过日期对象。您可以使用几种不同的方法来获取所需的日期格式。

    【讨论】:

    • 仅链接的答案很糟糕。如果链接失效了,你的回答就没用了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多