如何使用NodeJS将UTC日期格式化为`YYYY-MM-DD hh:mm:ss`字符串?

IT技术 javascript node.js date
2021-01-14 04:14:54

使用 NodeJS,我想将 a 格式化Date为以下字符串格式:

var ts_hms = new Date(UTC);
ts_hms.format("%Y-%m-%d %H:%M:%S");

我怎么做?

6个回答

如果你使用 Node.js,你肯定有 EcmaScript 5,所以 Date 有一个toISOString方法。您要求对 ISO8601 稍作修改:

new Date().toISOString()
> '2012-11-04T14:51:06.157Z'

所以只要删掉一些东西,你就准备好了:

new Date().toISOString().
  replace(/T/, ' ').      // replace T with a space
  replace(/\..+/, '')     // delete the dot and everything after
> '2012-11-04 14:55:45'

或者,在一行中: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 必须是 UTC(也由第一个结果的尾随 Z 表示),因此默认情况下您会获得 UTC(总是一件好事)。

避免使用库的巧妙而简单的解决方案——很好!
2021-03-15 04:14:54
请注意,通过删除时区,它现在代表每个时区中具有不同偏移量的不同时刻。
2021-03-30 04:14:54
@RobG您可以说任何没有明确时区的日期时间表示。
2021-04-03 04:14:54
如果你得到错误Object has no method 'toISOString',你错过了new
2021-04-06 04:14:54
需要注意的一件事是,以这种方式使用正则表达式很慢,而且您在这里甚至不需要它们,this:new Date().toISOString().replace('T', ' ').substr(0, 19)工作得很好。
2021-04-09 04:14:54

2021-10-06 更新:添加了 Day.js 并删除了@ashleedawg 的虚假编辑 2021-04-07
更新:@Tampa 添加了 Luxon。
更新 2021-02-28:现在应该注意 Moment.js 不再被积极开发。它不会很快消失,因为它嵌入在许多其他事物中。该网站有一些替代方案的建议以及原因的解释。
2017-03-29 更新:添加了 date-fns、关于 Moment 和 Datejs 的一些注释
2016-09-14 更新:添加了 SugarJS,它似乎具有一些出色的日期/时间功能。


好吧,既然没有人真正提供过实际的答案,这里是我的。

图书馆无疑是以标准方式处理日期和时间的最佳选择。日期/时间计算中有很多边缘情况,因此能够将开发移交给库很有用。

以下是主要的Node兼容时间格式库的列表

  • Day.js [ 2021-10-06添加]“具有相同现代 API 的 Moment.js 的快速 2kB 替代品”
  • Luxon [ 2017 年 3 月 29 日添加,感谢 Tampa ] “一个强大、现代且友好的 JavaScript 日期和时间包装器。” - MomentJS 使用不可变类型、链接等从头开始重建。
  • Moment.js [感谢 Mustafa ] “用于解析、操作和格式化日期的轻量级 (4.3k) javascript 日期库” - 包括国际化、计算和相关日期格式 -更新 2017-03-29:不太轻量级更多但仍然是最全面的解决方案,特别是如果您需要时区支持。- 2021-02-28 更新:不再处于积极开发阶段。
  • date-fns [ 2017-03-29 添加,感谢 Fractalf ] 小巧、快速,适用于标准的 JS 日期对象。如果您不需要时区支持,则是 Moment 的绝佳替代品。
  • SugarJS - 一个通用的辅助库,为 JavaScript 的内置对象类型添加了急需的功能。包括一些出色的日期/时间功能。
  • strftime - 正如它所说的那样,漂亮而简单
  • dateutil - 这是我在 MomentJS 之前使用过的
  • 节点格式日期
  • TimeTraveller - “Time Traveler 提供了一组实用方法来处理日期。从加法和减法到格式化。Time Traveler 只扩展它创建的日期对象,而不会污染全局命名空间。”
  • Tempus [感谢 Dan D ] - 更新:这也可以与 Node 一起使用并与 npm 一起部署,请参阅文档

还有非节点库:

  • Datejs [感谢 Peter Olson ] - 没有打包在 npm 或 GitHub 中,所以不太容易与 Node 一起使用 - 不推荐,因为自 2007 年以来没有更新!
这也是高度相关的date-fns.org ( github.com/date-fns/date-fns )
2021-03-25 04:14:54
RunKit 上的 Moment + toISOString():runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
2021-03-29 04:14:54
截至 2018 年 2 月,Moment 背后的人有一个名为 Luxon 的实验moment.github.io/luxon/index.html
2021-03-31 04:14:54
谢谢@alxndr,看起来像是一个有用的重启。
2021-04-04 04:14:54

有一个用于转换的库:

npm install dateformat

然后写出你的需求:

var dateFormat = require('dateformat');

然后绑定值:

var day=dateFormat(new Date(), "yyyy-mm-dd h:MM:ss");

见日期格式

internal/modules/cjs/loader.js:1167 throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath); ^ Error [ERR_REQUIRE_ESM]: Must use import to load ES Module:
2021-03-30 04:14:54
虽然它不支持 CJS module,但不能让它在 NextJS 中工作
2021-04-01 04:14:54

我一般不反对图书馆。在这种情况下,通用库似乎过大了,除非申请过程的其他部分过时了。

编写像这样的小型实用程序函数对于初学者和有经验的程序员来说也是一种有用的练习,并且可以成为我们中间的新手的学习经验。

function dateFormat (date, fstr, utc) {
  utc = utc ? 'getUTC' : 'get';
  return fstr.replace (/%[YmdHMS]/g, function (m) {
    switch (m) {
    case '%Y': return date[utc + 'FullYear'] (); // no leading zeros required
    case '%m': m = 1 + date[utc + 'Month'] (); break;
    case '%d': m = date[utc + 'Date'] (); break;
    case '%H': m = date[utc + 'Hours'] (); break;
    case '%M': m = date[utc + 'Minutes'] (); break;
    case '%S': m = date[utc + 'Seconds'] (); break;
    default: return m.slice (1); // unknown code, remove %
    }
    // add leading zero if required
    return ('0' + m).slice (-2);
  });
}

/* dateFormat (new Date (), "%Y-%m-%d %H:%M:%S", true) returns 
   "2012-05-18 05:37:21"  */
虽然这可能确实对学习有用,但我不得不同意这比使用小型、结构良好的库更好的结果。一个库将得到维护,并且更有可能涵盖设计中的边缘情况,这些情况对您来说可能乍一看并不明显,但在某些时候很容易被咬——日期/时间计算由于其固有的复杂性而特别容易出现这些问题。
2021-03-17 04:14:54
不。在这种情况下绝对使用库。格式可能会改变。即使它没有改变,这也会增加代码的复杂性。维护您代码的其他人将不得不花时间,试图理解这个函数并确保它是正确的。练习是为了学校;问题是关于现实生活中的使用。当然,除非这是你的第一个或第二个“真正的”项目;那么做这样的事情可能会很好,这样你就可以了解为什么将来不应该这样做。
2021-03-19 04:14:54
这是 String.replace() 方法的很好用法,+1 创意
2021-03-22 04:14:54
我很欣赏使用库作为经过验证的/久经考验的代码的普遍观点,但它们也会增加部署的复杂性。此代码将所有与日历相关的细节委托给基础 Date 对象,并在适当的位置调用例如 getUTCDate() 方法。此外,如果有人在此代码中发现错误,他们可以在 stackoverflow.com 上报告,这基本上与任何其他库的多眼/浅错误方面相匹配。+1
2021-04-07 04:14:54

以您想要的格式获取时间戳的易于阅读和可定制的方式,无需使用任何库:

function timestamp(){
  function pad(n) {return n<10 ? "0"+n : n}
  d=new Date()
  dash="-"
  colon=":"
  return d.getFullYear()+dash+
  pad(d.getMonth()+1)+dash+
  pad(d.getDate())+" "+
  pad(d.getHours())+colon+
  pad(d.getMinutes())+colon+
  pad(d.getSeconds())
}

(如果您需要 UTC 格式的时间,则只需更改函数调用。例如“getMonth”变为“getUTCMonth”)