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

Tam*_*mpa 218 javascript date node.js

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

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

我怎么做?

chb*_*own 472

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

new Date().toISOString()
> '2012-11-04T14:51:06.157Z'
Run Code Online (Sandbox Code Playgroud)

所以只需剪掉一些东西,然后你就可以了:

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

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

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

  • 有一点需要注意的是,使用正则表达式这种方式很慢,你甚至不需要它们,这个:`new Date().toISOString().replace('T','').substr(0,19 )`工作得很好. (25认同)
  • 如果你得到错误,'对象没有方法'toISOString',你错过了'new` (10认同)
  • 避免使用库的聪明而简单的解决方案 - 很好! (4认同)
  • 请注意,通过删除时区,它现在在每个时区中以不同的偏移量表示不同的时刻。 (2认同)
  • @RobG您可以说任何没有明确时区的日期时间表示。 (2认同)
  • 改进答案:`(new Date()).toISOString().slice(0,16).replace('T',' ')`,它删除了正则表达式。这无需几秒钟即可给出答案。 (2认同)

Jul*_*ght 101

更新2017-03-29:添加日期fns,关于Moment和Datejs的一些注释
更新2016-09-14:添加了SugarJS,它似乎有一些出色的日期/时间功能.


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

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

以下是主节点兼容时间格式库的列表:

  • Moment.js [ 感谢Mustafa ]"用于解析,操作和格式化日期的轻量级(4.3k)javascript日期库" - 包括国际化,计算和相对日期格式 - 更新2017-03-29:不太轻量级更多但仍然是最全面的解决方案,特别是如果您需要时区支持.
  • date-fns [ 添加2017-03-29,感谢Fractalf ]小巧,快速,适用于标准JS日期对象.如果您不需要时区支持,可以替代Moment.
  • SugarJS - 一个通用助手库,为JavaScripts内置对象类型添加了许多必需的功能.包括一些优秀的日期/时间功能.
  • strftime - 正如它所说的那样,美观而简单
  • dateutil - 这是我以前在MomentJS之前使用的那个
  • 节点formatdate
  • TimeTraveller - "Time Traveler提供了一组实用方法来处理日期.从添加和减去,到格式化.Time Traveler只扩展它创建的日期对象,而不会污染全局命名空间."
  • Tempus [感谢Dan D] - 更新:这也可以与Node一起使用并使用npm部署,请参阅文档

还有非节点库:

  • Datejs [感谢Peter Olson] - 没有打包在npm或GitHub中,所以不太容易使用Node - 不是真的推荐,因为自2007年以来没有更新!

  • 这也是高度相关的https://date-fns.org/(https://github.com/date-fns/date-fns) (2认同)

Ond*_*CAN 62

有一个转换库:

npm install dateformat
Run Code Online (Sandbox Code Playgroud)

然后写下你的要求:

var dateFormat = require('dateformat');
Run Code Online (Sandbox Code Playgroud)

然后绑定值:

var day=dateFormat(new Date(), "yyyy-mm-dd h:MM:ss");
Run Code Online (Sandbox Code Playgroud)

dateformat

  • 什么是`result.request_date`? (14认同)
  • ```内部/modules/cjs/loader.js:1167 抛出新的 ERR_REQUIRE_ESM(文件名、parentPath、packageJsonPath); ^ 错误 [ERR_REQUIRE_ESM]:必须使用导入来加载 ES 模块:``` (3认同)
  • 但它不支持 CJS 模块,无法让它在 NextJS 中工作 (2认同)

HBP*_*HBP 40

我一般都不反对图书馆.在这种情况下,通用库似乎过度,除非应用程序的其他部分过程严重.

编写诸如此类的小实用功能对于初学者和有成就的程序员来说也是一种有用的练习,对于我们中的新手来说可以是一种学习体验.

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"  */
Run Code Online (Sandbox Code Playgroud)

  • 虽然这对学习确实有用,但我不得不反对这比使用一个结构良好的小型库更好.一个库将被维护,并且更有可能覆盖设计中的边缘情况,这些边缘情况对您来说可能一见不露,但在某些时候可能很容易咬人 - 由于其固有的复杂性,日期/时间计算特别容易出现这些问题. (24认同)
  • 这是String.replace()方法的非常好的用法,+1用于创造力 (8认同)
  • 在这种情况下,绝对要使用库.格式可能会改变.即使它没有改变,这也增加了代码的复杂性.维护代码的其他人必须花时间,试图理解这个功能并确保它是正确的.练习是为了学校; 问题是关于现实生活的使用.当然,除非这是你的第一个或第二个"真正的"项目; 那么做这样的事可能会很好,所以你可以了解为什么你将来不应该这样做. (5认同)
  • 我很欣赏使用库作为经过验证/经过强化处理的代码的一般情绪,但它们也会增加部署的复杂性.此代码将所有与日历相关的细微差别委托给基础Date对象,并在适当的位置调用例如getUTCDate()方法.此外,如果有人发现此代码中的错误,他们可以在stackoverflow.com上报告它,基本上匹配任何其他库的多眼/浅漏方面.+1 (2认同)

Mtl*_*Dev 10

易于阅读和自定义的方式来获得所需格式的时间戳,而无需使用任何库:

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())
}
Run Code Online (Sandbox Code Playgroud)

(如果您需要UTC格式的时间,那么只需更改函数调用.例如"getMonth"变为"getUTCMonth")


Dav*_*iró 9

javascript库sugar.js(http://sugarjs.com/)具有格式化日期的功能

例:

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')
Run Code Online (Sandbox Code Playgroud)

  • 看起来像一个非常棒的库.他们的格式非常漂亮,他们的文档显示了我在JavaScript中遇到的其他一百种优雅的解决方案.试试这个. (3认同)

Tín*_*ang 7

我在 Nodejs 和 angularjs 上使用dateformat,太好了

安装

$ npm install dateformat
$ dateformat --help
Run Code Online (Sandbox Code Playgroud)

演示

var dateFormat = require('dateformat');
var now = new Date();

// Basic usage
dateFormat(now, "dddd, mmmm dS, yyyy, h:MM:ss TT");
// Saturday, June 9th, 2007, 5:46:21 PM

// You can use one of several named masks
dateFormat(now, "isoDateTime");
// 2007-06-09T17:46:21

// ...Or add your own
dateFormat.masks.hammerTime = 'HH:MM! "Can\'t touch this!"';
dateFormat(now, "hammerTime");
// 17:46! Can't touch this!

// You can also provide the date as a string
dateFormat("Jun 9 2007", "fullDate");
// Saturday, June 9, 2007
...
Run Code Online (Sandbox Code Playgroud)


jaz*_*007 7

对于日期格式化,最简单的方法是使用 moment lib。https://momentjs.com/

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 6

替代#6233....

将 UTC 偏移量添加到本地时间,然后使用toLocaleDateString()该对象的方法将其转换为所需的格式Date

// Using the current date/time
let now_local = new Date();
let now_utc = new Date();

// Adding the UTC offset to create the UTC date/time
now_utc.setMinutes(now_utc.getMinutes() + now_utc.getTimezoneOffset())

// Specify the format you want
let date_format = {};
date_format.year = 'numeric';
date_format.month = 'numeric';
date_format.day = '2-digit';
date_format.hour = 'numeric';
date_format.minute = 'numeric';
date_format.second = 'numeric';

// Printing the date/time in UTC then local format
console.log('Date in UTC: ', now_utc.toLocaleDateString('us-EN', date_format));
console.log('Date in LOC: ', now_local.toLocaleDateString('us-EN', date_format));
Run Code Online (Sandbox Code Playgroud)

我正在创建一个默认为当地时间的日期对象。我正在向其添加 UTC 偏移量。我正在创建一个日期格式对象。我以所需的格式显示 UTC 日期/时间:

在此输入图像描述


jpm*_*tte 5

使用Date对象中提供的方法,如下所示:

var ts_hms = new Date();

console.log(
    ts_hms.getFullYear() + '-' + 
    ("0" + (ts_hms.getMonth() + 1)).slice(-2) + '-' + 
    ("0" + (ts_hms.getDate())).slice(-2) + ' ' +
    ("0" + ts_hms.getHours()).slice(-2) + ':' +
    ("0" + ts_hms.getMinutes()).slice(-2) + ':' +
    ("0" + ts_hms.getSeconds()).slice(-2));
Run Code Online (Sandbox Code Playgroud)

它看起来确实很脏,但是应该可以与JavaScript核心方法配合使用

  • 我同意您需要将1加到getMonth()上,因为一月份的返回值是0,但是我不认为您想将1加到getDate()上。 (2认同)

dre*_*mLo 5

检查下面的代码和指向MDN的链接

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

// exact format
console.log(new Date().toISOString().replace('T', ' ').substring(0, 19))

// other formats
console.log(new Date().toUTCString())
console.log(new Date().toLocaleString('en-US'))
console.log(new Date().toString())
Run Code Online (Sandbox Code Playgroud)