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


242

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

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

我怎么做?


4
没有任何库就很麻烦。我建议使用datejs
Peter Olson



Tempus的表现很棒。广告问题将立即出现。
坦帕2012年

1
Datejs和Tempus都不是Node库(尽管它们可以与Node一起使用,但不能使用npm库安装程序)。由于没有人把这些作为实际答案,所以我自己做了。
朱利安·奈特

Answers:


528

如果使用的是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(总是一件好事)。


4
避免使用库的聪明而简单的解决方案-太好了!
Wingman4l7

11
万一遇到错误,Object has no method 'toISOString'您会错过new
allenhwkim 2014年

29
需要注意的一件事是,以这种方式使用正则表达式的速度很慢,而且您甚至在这里都不需要它们,这new Date().toISOString().replace('T', ' ').substr(0, 19)很正常。
Killah'2

2
请注意,通过删除时区,它现在在每个时区中以不同的偏移量表示不同的时刻。
RobG

1
@RobG您可以说任何没有明确时区的日期时间表示。
菲尔

105

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


好的,因为没有人提供实际答案,这是我的。

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

这是与Node兼容的主要时间格式库的列表:

  • Moment.js [ 感谢Mustafa ]“用于解析,处理和格式化日期的轻量级(4.3k)javascript日期库”-包括国际化,计算和相对日期格式- 更新2017-03-29:不太轻巧仍然是最全面的解决方案,尤其是在需要时区支持的情况下。
  • date-fns [ 由于Fractalf而于2017-03-29添加 ]小型,快速,可与标准JS日期对象一起使用。如果您不需要时区支持,则可以替代Moment。
  • SugarJS-一个通用的帮助程序库,为JavaScript内置对象类型添加了许多急需的功能。包括一些出色的日期/时间功能。
  • strftime,很简单
  • dateutil这是我在MomentJS之前使用的工具
  • 节点格式日期
  • 时间旅行者 “ Time Traveler提供了一组处理日期的实用程序方法。从加法和减法到格式化仅扩展其创建的日期对象,而不会污染全局名称空间。”
  • 坦普斯 [感谢Dan D]-更新:这也可以与Node一起使用并与npm一起部署,请参阅文档

也有非节点库:

  • Datejs [感谢Peter Olson]-未打包在npm或GitHub中,因此不太容易与Node一起使用-不太推荐使用,因为自2007年以来就没有更新!

2
这也是高度相关的date-fns.orggithub.com/date-fns/date-fns
Fractalf

截至2018年2月,Moment背后的人们进行了名为Luxon的实验。github.io
luxon /

谢谢@alxndr,看起来像是有用的重启。
朱利安·奈特

在RunKit上的瞬间+ toISOString():runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane

70

有一个转换库:

npm install dateformat

然后写下您的要求:

var dateFormat = require('dateformat');

然后绑定值:

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

参见dateformat


14
什么result.request_date
Dan Dascalescu'9

45

我对图书馆一无所知。在这种情况下,除非应用程序过程的其他部分日期过长,否则通用库似乎显得有些过时。

编写诸如此类的小型实用程序函数对于初学者和熟练的程序员而言都是有用的练习,对于我们中的新手来说都是一种学习经验。

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"  */

25
尽管这确实可能对学习有用,但我不得不不同意这是比使用小型,结构良好的库更好的结果。库将得到维护,并且可能会覆盖设计中的一些极端情况,这些情况乍一看对您而言可能并不明显,但在某些时候却容易咬人-由于日期/时间计算固有的复杂性,因此特别容易出现这些问题。
朱利安·奈特

8
这是String.replace()方法的很好用法,为创造力+1
JamieJag 2012年

5
否。在这种情况下,绝对要使用库。格式可能会改变。即使它没有改变,也增加了代码的复杂性。其他维护您的代码的人将不得不花费时间,试图理解此功能并确保其正确。锻炼是为了上学;问题是关于现实生活的使用情况。当然,除非这是您的第一个或第二个“实际”项目;那么做这样的事情可能会很好,因此您可以了解为什么将来不应该这样做。
osa

3
我赞赏将库用作经过验证的/经过战斗加固的代码的总体感觉,但是它们也会增加部署的复杂性。该代码将所有与日历相关的细微操作委托给基础的Date对象,并在适当的位置调用例如getUTCDate()方法。另外,如果任何人在此代码中发现错误,他们都可以在stackoverflow.com上报告该错误,基本上与任何其他库的多眼/浅眼bug匹配。+1
steamer14年

11

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

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”)


9

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

例:

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')

3
看起来像一个很棒的图书馆。他们的格式非常漂亮,他们的文档为我在JavaScript中感到沮丧的其他一百件事展示了优雅的解决方案。要尝试一下。
eimajenthat

6

使用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));

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


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

5

我正在使用dateformat在Nodejs和angularjs上,很好

安装

$ npm install dateformat
$ dateformat --help

演示

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
...

3
new Date(2015,1,3,15,30).toLocaleString()

//=> 2015-02-03 15:30:00

欢迎使用StackOverflow。请修改您的答案,否则您可能会被否决。现在,这只是一个没有上下文的建议。请参见此处,了解如何编写一个好的答案
jacefarm

这发生在de-locale(因此toLocaleString)的情况下:3.2.2015, 15:30:00
alwe

2

替代方案#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));

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

在此处输入图片说明


1

使用x-date模块,它是x类库的子模块之一;

require('x-date') ; 
  //---
 new Date().format('yyyy-mm-dd HH:MM:ss')
  //'2016-07-17 18:12:37'
 new Date().format('ddd , yyyy-mm-dd HH:MM:ss')
  // 'Sun , 2016-07-17 18:12:51'
 new Date().format('dddd , yyyy-mm-dd HH:MM:ss')
 //'Sunday , 2016-07-17 18:12:58'
 new Date().format('dddd ddSS of mmm , yy')
  // 'Sunday 17thth +0300f Jul , 16'
 new Date().format('dddd ddS  mmm , yy')
 //'Sunday 17th  Jul , 16'

1
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

使用.toString(),格式变为

replace(/ T /,'')。//将T替换为''2017-01-15T ...

replace(/..+/,'')//对于... 13:50:16.1271

例如,请参见var datehour

var date="2017-01-15T13:50:16.1271".toString("yyyyMMddHHmmss").
                    replace(/T/, ' ').      
                    replace(/\..+/, '');
    
                    var auxCopia=date.split(" ");
                    date=auxCopia[0];
                    var hour=auxCopia[1];

console.log(date);
console.log(hour);


1
您能否提供一些解释作为答案背后的背景?
T-Heron

欢迎使用StackOverflow。请修改您的答案,否则您可能会被否决。现在,这只是一个没有上下文的建议。请参见此处,了解如何编写一个好的答案
jacefarm

@ user7396942-现在投票赞成,用于在答案中添加上下文/解释。免责声明:我不是以前曾投票的人,因为现在看来情况好得多。
T-Heron

3
为什么.toString("yyyyMMddHHmmss")呢?
Arjan

1

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

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')

谢谢,@ Jazeb_007,即使我不需要它也对我有用,toISOString()并且toUTCString()
Bablu Ahmed


0
appHelper.validateDates = function (start, end) {
    var returnval = false;

    var fd = new Date(start);
    var fdms = fd.getTime();
    var ed = new Date(end);
    var edms = ed.getTime();
    var cd = new Date();
    var cdms = cd.getTime();

    if (fdms >= edms) {
        returnval = false;
        console.log("step 1");
    }
    else if (cdms >= edms) {
        returnval = false;
        console.log("step 2");
    }
    else {
        returnval = true;
        console.log("step 3");
    }
    console.log("vall", returnval)
    return returnval;
}

-1

我认为这实际上回答了您的问题。

在javascript中使用日期/时间太烦人了。经过几根白发,我发现这实际上很简单。

var date = new Date();
var year = date.getUTCFullYear();
var month = date.getUTCMonth();
var day = date.getUTCDate();
var hours = date.getUTCHours();
var min = date.getUTCMinutes();
var sec = date.getUTCSeconds();

var ampm = hours >= 12 ? 'pm' : 'am';
hours = ((hours + 11) % 12 + 1);//for 12 hour format

var str = month + "/" + day + "/" + year + " " + hours + ":" + min + ":" + sec + " " + ampm;
var now_utc =  Date.UTC(str);

这是一个小提琴


您需要在基于零的月份中加1。
Mistic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.