我有一个Date对象。如何呈现以下代码片段的标题部分?

<abbr title="2010-04-02T14:12:07">A couple days ago</abbr>

我有另一个库的“相对时间”部分。

我试过以下几种方法:

function isoDate(msSinceEpoch) {

   var d = new Date(msSinceEpoch);
   return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' +
          d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();

}

但这给了我:

"2010-4-2T3:19"

当前回答

注:截至2022-03年,这个答案仍在获得点赞。moment.js库已弃用。这是两个主要的替代方案:Luxon和Day.js,其他的在弃用链接中提到。

勒克桑

《Luxon》可以看作是《Moment》的演变。作者是 Isaac Cambron, Moment的长期撰稿人。请阅读为什么 国际光子存在吗?以及Luxon中的For Moment用户页面 文档。 区域:提供国际时区:提供国际时区

Day.js

Day.js被设计成一个极简的Moment.js的替代品,使用 类似的API。它不是一个随意的替代品,但如果你习惯了 如果你正在使用Moment的API,想要快速上手,可以考虑使用 Day.js。 区域设置:可单独导入的自定义数据文件 区域:通过插件提供

我使用Day.js是因为大小不同,但是Luxon更容易处理。


在web上,几乎每一个to- iso方法都在输出字符串之前应用到“Z”ulu时间(UTC)的转换来删除时区信息。浏览器的本机. toisostring()也会删除时区信息。

这将丢弃有价值的信息,因为服务器或接收方总是可以将完整的ISO日期转换为Zulu时间或所需的任何时区,同时仍然可以获得发送方的时区信息。

我遇到的最好的解决方案是使用Moment.js javascript库,并使用以下代码:

获取带有时区信息和毫秒的当前ISO时间

now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T20:11:11.234+0100"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T19:11:11.234+0000"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
// "2013-03-08T19:11:11Z" <- better use the native .toISOString() 

获取原生JavaScript Date对象的ISO时间,其中包含时区信息,但不包含毫秒

var current_time = Date.now();
moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")

这可以与Date.js结合,以获得Date.today()这样的函数,其结果可以传递给moment。

像这样格式化的日期字符串是JSON编译器,很适合存储到数据库中。Python和c#似乎喜欢它。

其他回答

问题是ISO格式精度降低。瞧:

 new Date().toISOString().slice(0, 19) + 'Z'
 // '2014-10-23T13:18:06Z'

假设后面的Z是需要的,否则就省略。

用一些糖和现代语法来扩展肖恩伟大而简洁的回答:

// date.js

const getMonthName = (num) => {
  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Oct', 'Nov', 'Dec'];
  return months[num];
};

const formatDate = (d) => {
  const date = new Date(d);
  const year = date.getFullYear();
  const month = getMonthName(date.getMonth());
  const day = ('0' + date.getDate()).slice(-2);
  const hour = ('0' + date.getHours()).slice(-2);
  const minutes = ('0' + date.getMinutes()).slice(-2);

  return `${year} ${month} ${day}, ${hour}:${minutes}`;
};

module.exports = formatDate;

然后如。

import formatDate = require('./date');

const myDate = "2018-07-24T13:44:46.493Z"; // Actual value from wherever, eg. MongoDB date
console.log(formatDate(myDate)); // 2018 Jul 24, 13:44

请参阅https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Date:页上的最后一个示例

/* Use a function for the exact format desired... */
function ISODateString(d) {
    function pad(n) {return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
         + pad(d.getUTCMonth()+1)+'-'
         + pad(d.getUTCDate())+'T'
         + pad(d.getUTCHours())+':'
         + pad(d.getUTCMinutes())+':'
         + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z

我通常不希望显示UTC日期,因为客户不喜欢在头脑中进行转换。要显示本地ISO日期,我使用函数:

function toLocalIsoString(date, includeSeconds) {
    function pad(n) { return n < 10 ? '0' + n : n }
    var localIsoString = date.getFullYear() + '-'
        + pad(date.getMonth() + 1) + '-'
        + pad(date.getDate()) + 'T'
        + pad(date.getHours()) + ':'
        + pad(date.getMinutes()) + ':'
        + pad(date.getSeconds());
    if(date.getTimezoneOffset() == 0) localIsoString += 'Z';
    return localIsoString;
};

上面的函数省略了时区偏移量信息(除非本地时间恰好是UTC),所以我使用下面的函数来显示单个位置的本地偏移量。如果你想显示每次的偏移量,你也可以把它的输出附加到上面函数的结果中:

function getOffsetFromUTC() {
    var offset = new Date().getTimezoneOffset();
    return ((offset < 0 ? '+' : '-')
        + pad(Math.abs(offset / 60), 2)
        + ':'
        + pad(Math.abs(offset % 60), 2))
};

toLocalIsoString使用pad。如果需要,它的工作方式几乎像任何pad功能,但为了完整起见,这是我使用的:

// Pad a number to length using padChar
function pad(number, length, padChar) {
    if (typeof length === 'undefined') length = 2;
    if (typeof padChar === 'undefined') padChar = '0';
    var str = "" + number;
    while (str.length < length) {
        str = padChar + str;
    }
    return str;
}

我可以用非常少的代码得到以下的输出。

var ps = new Date('2010-04-02T14:12:07')  ;
ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs";

输出:

Fri Apr 02 2010 19:42 hrs