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

Posted

技术标签:

【中文标题】如何使用 NodeJS 将 UTC 日期格式化为 `YYYY-MM-DD hh:mm:ss` 字符串?【英文标题】:How to format a UTC date as a `YYYY-MM-DD hh:mm:ss` string using NodeJS? 【发布时间】:2012-05-25 15:16:17 【问题描述】:

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

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

我该怎么做?

【问题讨论】:

没有任何库有点麻烦。我推荐使用datejs 或momentjs 或Tempus Datejs 和 Tempus 都不是 Node 库(尽管它们可以与 Node 一起使用,但您不能使用 npm 库安装程序)。由于没有人提出这些作为实际答案,我自己做了。 @RobG - 实际上,他在 Q 中并没有说他不想要图书馆,只是说他需要一个答案,我的评论(从 4 年前开始!)是为了鼓励人们实际给出答案而不是评论。你可以从我的回答中看到,我很清楚有很多,我等了一周,看看是否有其他人会给出任何答案。 4年多后的这种批评也许没有那么有用? 【参考方案1】:

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

【讨论】:

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

2021 年 10 月 6 日更新:添加了 Day.js 并删除了 @ashleedawg 的虚假编辑 2021 年 4 月 7 日更新:@Tampa 添加了 Luxon。 更新 2021-02-28:现在应该注意 Moment.js 不再被积极开发。它不会很快消失,因为它嵌入了许多其他事物中。该网站对alternatives 有一些建议并解释了原因。 2017 年 3 月 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 年 3 月 29 日添加,感谢 Fractalf] 小巧、快速,适用于标准 JS 日期对象。如果您不需要时区支持,则是 Moment 的绝佳替代品。 SugarJS - 一个通用的帮助库,为 JavaScript 的内置对象类型添加了急需的特性。包括一些出色的日期/时间功能。 strftime - 正如它所说的那样,漂亮而简单 dateutil - 这是我在 MomentJS 之前使用的那个 node-formatdate 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) Moment 背后的人在 2018 年 2 月进行了一项名为 Luxon 的实验 moment.github.io/luxon/index.html 感谢@alxndr,看来重启很有用。 Moment + toISOString() on RunKit:runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607【参考方案3】:

有一个转换库:

npm install dateformat

然后写下你的要求:

var dateFormat = require('dateformat');

然后绑定值:

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

见dateformat

【讨论】:

它不支持 CJS 模块,无法在 NextJS 中工作 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:【参考方案4】:

我一般不反对图书馆。在这种情况下,通用库似乎有点过头了,除非应用程序流程的其他部分过时了。

编写这样的小型实用程序函数对于初学者和成熟的程序员来说也是一个有用的练习,对于我们当中的新手来说也是一种学习经验。

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

【讨论】:

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

无需使用任何库,即可轻松读取和自定义获取所需格式的时间戳

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

【讨论】:

【参考方案6】:

检查下面的代码和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())

【讨论】:

【参考方案7】:

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

例子:

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

【讨论】:

看起来像一个非常棒的库。他们的格式非常流畅,他们的文档为我在 JavaScript 中遇到的一百件事提供了优雅的解决方案。打算试一试。 今天早上刚刚测试过了。看起来真的很不错,玩得很开心。【参考方案8】:

我在 Nodejs 和 angularjs 使用 dateformat,非常好

安装

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

【讨论】:

【参考方案9】:

使用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 核心方法一起工作

【讨论】:

我同意你需要在 getMonth() 中加 1,因为一月返回为 0,但我认为你不想在 getDate() 中加 1。【参考方案10】:
new Date(2015,1,3,15,30).toLocaleString()

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

【讨论】:

欢迎来到 ***。请编辑您的答案,否则您可能会被否决。就像现在一样,这只是一个没有上下文的建议。请在此处查看How to Write a Good Answer。 这种情况发生在 de-locale 中(因此是 toLocaleString):3.2.2015, 15:30:00【参考方案11】:

替代 #6233....

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

// 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 日期/时间:

【讨论】:

【参考方案12】:

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

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

【讨论】:

谢谢,@Jazeb_007 它对我有用,即使我不需要 toISOString()toUTCString() moment.js 从现在开始将只处于维护模式momentjs.com/docs/#/-project-status 请使用日期【参考方案13】:

反映你的时区,你可以使用这个

var datetime = new Date();
var dateString = new Date(
  datetime.getTime() - datetime.getTimezoneOffset() * 60000
);
var curr_time = dateString.toISOString().replace("T", " ").substr(0, 19);
console.log(curr_time);

【讨论】:

【参考方案14】:

使用x-date 模块,它是x-class library 的子模块之一;

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'

【讨论】:

【参考方案15】:

我需要一个没有语言环境和语言支持的简单格式库。所以我修改了

http://www.mattkruse.com/javascript/date/date.js

并使用它。见https://github.com/adgang/atom-time/blob/master/lib/dateformat.js

文档很清楚。

【讨论】:

【参考方案16】:
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

使用 .toString(),这变成了格式

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

replace(/..+/, '') //for ...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);

【讨论】:

你能提供一些解释作为你答案背后的背景吗? 欢迎来到 ***。请编辑您的答案,否则您可能会被否决。就像现在一样,这只是一个没有上下文的建议。请在此处查看How to Write a Good Answer。 @user7396942 - 现在投票赞成,用于在您的答案中添加上下文/解释。免责声明:我不是以前投反对票的人,因为现在它看起来好多更好。 为什么是.toString("yyyyMMddHHmmss")【参考方案17】:
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;

【讨论】:

【参考方案18】:

这是我编写的一个轻量级库simple-date-format,可在 node.js 和浏览器中运行

安装

使用 NPM 安装
npm install @riversun/simple-date-format

直接加载(浏览器),
<script src="https://cdn.jsdelivr.net/npm/@riversun/simple-date-format/lib/simple-date-format.js"></script>

加载库

ES6
import SimpleDateFormat from "@riversun/simple-date-format";
CommonJS (node.js)
const SimpleDateFormat = require('@riversun/simple-date-format');

用法1

const date = new Date('2018/07/17 12:08:56');
const sdf = new SimpleDateFormat();
console.log(sdf.formatWith("yyyy-MM-dd'T'HH:mm:ssXXX", date));//to be "2018-07-17T12:08:56+09:00"

Run on Pen

用法2

const date = new Date('2018/07/17 12:08:56');
const sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
console.log(sdf.format(date));//to be "2018-07-17T12:08:56+09:00"

格式化模式

https://github.com/riversun/simple-date-format#pattern-of-the-date

【讨论】:

【参考方案19】:

从“日期格式”导入日期格式; var ano = new Date()

<footer>
    <span>props.data.footer_desc <a href=props.data.footer_link>props.data.footer_text_link</a> " "
    (day = dateFormat(props.data.updatedAt, "yyyy"))
            </span>
</footer>

rodape

【讨论】:

欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。【参考方案20】:

这是一个方便的香草单线(改编自this):

var timestamp = 
  new Date((dt = new Date()).getTime() - dt.getTimezoneOffset() * 60000)
  .toISOString()
  .replace(/(.*)T(.*)\..*/,'$1 $2')
console.log(timestamp)

输出:2022-02-11 11:57:39

【讨论】:

【参考方案21】:

我认为这实际上回答了您的问题。 在 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);

Here is a fiddle

【讨论】:

从零开始的月份需要加1。

以上是关于如何使用 NodeJS 将 UTC 日期格式化为 `YYYY-MM-DD hh:mm:ss` 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何轻松地将GQLQuery的日期字段格式化为另一个时区?

如何在 Go 中将时间戳格式化为 GMT?

C# DateTime 将日期字符串格式化为带时区的日期格式

将存储在mysql(utc格式)中的momentjs datetime格式化为Local DateTime

AWS Athena (Presto) - 如何将时间戳格式化为日期格式?

将 PST 中的日期与时间转换为 UTC 格式