網站搜尋

javascript - 如何使用 NodeJS 將 UTC 日期格式化為 `YYYY-MM-DD hh:mm:ss` 字串?


使用 NodeJS,我想將 Date 格式化為以下字串格式:

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

我該怎麼做?

答案#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(這總是件好事)。

答案#2

更新 2021-10-06:新增 Day.js 並移除 @ashleedawg 的多餘編輯
更新 2021-04-07:Luxon 由 @Tampa 新增。
更新 2021-02-28:現在應該注意到 Moment.js 已不再積極開發。它不會很快消失,因為它嵌入在許多其他東西中。網站上有一些替代方案建議和原因說明。
更新 2017-03-29:新增 date-fns,以及一些關於 Moment 和 Datejs 的說明
更新 2016-09-14:新增 SugarJS,它似乎具有一些優秀的日期/時間功能。


好吧,既然沒有人真正給出過實際的答案,這是我的答案。

圖書館當然是以標準方式處理日期和時間的最佳選擇。日期/時間計算中有很多邊緣案例,因此能夠將開發交給圖書館處理是非常有用的。

這裡列出主要的 Node 相容時間格式化函式庫:

  • Day.js [新增於 2021-10-06] "與 Moment.js 相同現代化 API 的快速 2kB 替代方案"
  • Luxon [新增於 2017-03-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 之前使用的工具
  • node-formatdate
  • TimeTraveller - "Time Traveller 提供了一組用於處理日期的實用方法。從加減日期到格式化日期。Time Traveller 只擴展它所創建的日期對象,不會污染全局命名空間。"
  • Tempus [感謝 Dan D] - 更新:這也可以與 Node 一起使用並透過 npm 部署,詳見文件

也有 非 Node 函式庫:

  • Datejs [感謝 Peter Olson] - 沒有在 npm 或 GitHub 上打包,所以使用 Node 並不容易 - 不太推薦,因為自 2007 年以來就沒有更新過!

答案#3

有一個用於轉換的函式庫:

npm install dateformat

然後寫下你的需求:

var dateFormat = require('dateformat');

然後綁定該值:

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

查看日期格式

答案#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"  */

答案#5

查看下面的程式碼以及 Date 物件、Intl.DateTimeFormat 的連結

// 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())

// log format
const parts = new Date().toString().split(' ')
console.log([parts[1], parts[2], parts[4]].join(' '))

// intl
console.log(new Intl.DateTimeFormat('en-US', {dateStyle: 'long', timeStyle: 'long'}).format(new Date()))

答案#6

以簡單易讀且可自訂的方式獲取所需格式的時間戳,無需使用任何函式庫:

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

答案#7

JavaScript 函式庫 sugar.js (http://sugarjs.com/) 有用來格式化日期的函式

範例:

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