時刻持續時間物件的格式插件。
這是 Moment.js JavaScript 日期庫的插件,用於為 Moment 持續時間添加全面的格式設定。
格式範本語法以現有的時刻日期格式範本語法為模式,並進行了一些修改,因為持續時間與日期根本不同。
該插件除了 Moment.js 本身之外沒有任何依賴項,可以在瀏覽器和 Node.js 中使用。
在可用且功能正常的情況下,該外掛程式使用Intl.NumberFormat#format
或Number#toLocaleString
來呈現格式化的數位輸出。不幸的是,許多環境沒有完全實現各自規範中的全套選項,並且有些環境提供了有缺陷的實現。
該插件對每個格式化程式執行功能測試,如果功能測試失敗,將恢復為後備函數以呈現格式化的數位輸出。若要強制此外掛程式始終使用後備數字格式功能,請將useToLocaleString
設為false
。可以使用本頁底部詳細說明的選項來本地化後備數字格式函數輸出。一般來說,如果預設的"en"
區域設定格式在某些裝置或某些環境中不可接受,您應該指定後備數位格式選項。
該插件使用BrowserStack 在一系列作業系統版本為2.2 至7 的Android 裝置以及作業系統版本為4.3 至11 的一系列iOS 裝置上進行了測試。進行了測試。
如果您在任何環境中發現格式問題或異常,請提出問題!
版本 2 還需要完成一些項目:
新增類型定義以支援 TypeScript、發布 NuGet 套件並支援目前使用的任何其他打包選項。
插件的測試應該要現代化,最好與 Moment.js 測試設定相符。
實作了 moment-duration-format 插件的版本 2 後,版本 3 有一些明顯的改進。
以下想法被記錄為問題並標有 3.0.0 里程碑。如果您對希望看到的內容有想法或評論,請在此項目上記錄問題!
回退數位格式本地化選項應包含在該外掛程式已新增的 Moment Locale 物件擴充功能中,用於本地化持續時間單位標籤。這會將所有本地化配置放在一處。
moment-duration-format 及其後備數字格式化函數不遵循與Number#toLocaleString
相同的 API 來處理有效數字和派別數字。應更新後備函數以使用toLocaleString
API,且外掛程式應直接公開 API 選項,而不是隱藏某些選項並將其隱藏在precision
和useSignificantDigits
選項後面。
公開後備數字格式化函數以及格式化程式功能測試函數將有助於測試並允許它們在格式化持續時間的上下文之外使用。
該插件依賴 moment.js,在目前發布的版本中未將其指定為套件依賴項。
Node.js
npm install moment-duration-format
鮑爾
bower install moment-duration-format
瀏覽器
<script src="path/to/moment-duration-format.js"></script>
該插件將始終嘗試將自身安裝到root.moment
實例(如果存在)上。
該外掛程式會將其設定函數安裝到root.momentDurationFormatSetup
中,以便稍後可以在任何時刻實例上呼叫它。
在瀏覽器中使用此外掛程式時,如果您的頁面上沒有先包含 moment.js,則在建立 moment 實例後,您需要手動呼叫window.momentDurationFormatSetup
。
若要將此插件用作模組,請使用require
函數。
var moment = require ( "moment" ) ;
var momentDurationFormatSetup = require ( "moment-duration-format" ) ;
該外掛程式會匯出 init 函數,以便可以在其他時刻實例上初始化持續時間格式。
若要將此插件與任何其他 moment.js 套件(例如moment-timezone
一起使用,請手動呼叫匯出的安裝函數以將該插件安裝到所需的套件中。
var moment = require ( "moment-timezone" ) ;
var momentDurationFormatSetup = require ( "moment-duration-format" ) ;
momentDurationFormatSetup ( moment ) ;
typeof moment . duration . fn . format === "function" ;
// true
typeof moment . duration . format === "function" ;
// true
moment . duration . fn . format
duration.fn.format
方法可以格式化任何時刻的持續時間。如果未提供模板或其他參數,預設模板函數將根據持續時間的值產生模板字串。
moment . duration ( 123 , "minutes" ) . format ( ) ;
// "2:03:00"
moment . duration ( 123 , "months" ) . format ( ) ;
// "10 years, 3 months"
可以使用三個可選參數呼叫持續時間格式方法,並傳回格式化字串。
moment . duration ( value , units ) . format ( [ template ] [ , precision ] [ , settings ] )
// formattedString
moment . duration . format
duration.format
方法允許同時協調多個時刻持續時間的格式。此函數接受持續時間數組作為其第一個參數,然後接受與duration.fn.format
函數相同的三個可選參數。該函數傳回一個格式化字串陣列。
moment . duration . format ( durationsArray , [ template ] [ , precision ] [ , settings ] ) ;
// formattedStringsArray
單一持續時間格式功能可用的所有選項都可以與多重持續時間格式功能一起使用。單一設定物件用於格式化每個單獨的持續時間。
moment . duration . format ( [
moment . duration ( 1 , "second" ) ,
moment . duration ( 1 , "minute" ) ,
moment . duration ( 1 , "hour" )
] , "d [days] hh:mm:ss" ) ;
// ["0:00:01", "0:01:00", "1:00:00"]
無效的持續時間被視為格式化值為0
。
var invalidDuration = moment . duration ( NaN , "second" ) ;
invalidDuration . isValid ( ) ;
// false
invalidDuration . format ( ) ;
// "0 seconds"
template
(string|function) 是用來建立格式化輸出的字串,或是傳回要用作格式範本的字串的函數。
moment . duration ( 123 , "minutes" ) . format ( "h:mm" ) ;
// "2:03"
模板字串被解析為時刻標記字符,這些字符被替換為每個單位類型的持續時間值。時刻標記是:
years: Y or y
months: M
weeks: W or w
days: D or d
hours: H or h
minutes: m
seconds: s
ms: S
使用方括號轉義模板字串中的標記字元。
moment . duration ( 123 , "minutes" ) . format ( "h [hrs], m [min]" ) ;
// "2 hrs, 3 mins"
對於某些持續時間格式,需要補零值。一起使用多個標記字元來創建正確的填充量。
moment . duration ( 3661 , "seconds" ) . format ( "h:mm:ss" ) ;
// "1:01:01"
moment . duration ( 15 , "seconds" ) . format ( "sss [s]" ) ;
// "015 s"
當格式模板被修剪時,最大量級渲染標記上的標記長度也可以被修剪。有關更多詳細信息,請參閱下面的“trim”和“forceLength”部分。
moment . duration ( 123 , "seconds" ) . format ( "h:mm:ss" ) ;
// "2:03"
表示毫秒的令牌長度為2
是一種特殊情況,最有可能用於將毫秒呈現為計時器輸出的一部分,例如mm:ss:SS
。在這種情況下,毫秒值將填入三位數,然後從左側截斷以呈現兩位數輸出。
moment . duration ( 9 , "milliseconds" ) . format ( "mm:ss:SS" , {
trim : false
} ) ;
// "00:00:00"
moment . duration ( 10 , "milliseconds" ) . format ( "mm:ss:SS" , {
trim : false
} ) ;
// "00:00:01"
moment . duration ( 999 , "milliseconds" ) . format ( "mm:ss:SS" , {
trim : false
} ) ;
// "00:00:99"
moment . duration ( 1011 , "milliseconds" ) . format ( "mm:ss:SS" , {
trim : false
} ) ;
// "00:01:01"
令牌可以在格式範本中出現多次,但所有實例必須共用相同的長度。如果不這樣做,則所有實例都將以該類型的第一個標記的長度呈現。
moment . duration ( 15 , "seconds" ) . format ( "ssss sss ss s" ) ;
// "0015 0015 0015 0015"
moment . duration ( 15 , "seconds" ) . format ( "s ss sss ssss" ) ;
// "15 15 15 15"
預設模板函數嘗試根據其大小來格式化持續時間。持續時間值越大,格式化輸出的單位就越大。
對於某些持續時間值,如果未在設定物件中設定該選項,則預設範本函數將預設trim
為"both"
(更多資訊請參閱下文)。
預設模板函數使用自動本地化的單位標籤(更多內容見下文)。
moment . duration ( 100 , "milliseconds" ) . format ( ) ;
// "100 milliseconds"
moment . duration ( 100 , "seconds" ) . format ( ) ;
// "1:40"
moment . duration ( 100 , "days" ) . format ( ) ;
// "3 months, 9 days"
moment . duration ( 100 , "weeks" ) . format ( ) ;
// "1 year, 10 months, 30 days"
moment . duration ( 100 , "months" ) . format ( ) ;
// "8 years, 4 months"
如果您需要對模板字串進行運行時控制,請使用自訂模板函數。模板函數透過設定物件的this
綁定來執行,並可以透過this.duration
存取底層的持續時間物件。任何設定都可以透過模板功能存取或修改。
此自訂模板函數根據持續時間的值使用不同的模板:
function customTemplate ( ) {
return this . duration . asSeconds ( ) >= 86400 ? "w [weeks], d [days]" : "hh:mm:ss" ;
}
moment . duration ( 65 , 'seconds' ) . format ( customTemplate , {
trim : false
} ) ;
// "00:01:05"
moment . duration ( 1347840 , 'seconds' ) . format ( customTemplate , {
trim : false
} ) ;
// "2 weeks, 2 days"
為了確保使用者友善的格式化輸出,標點符號從格式化輸出的開頭和結尾被修剪。具體來說,前導期和尾隨期.
、 逗號,
、 冒號:
和 空格
字符被刪除。
precision
(數字)定義最終值顯示的小數或整數位數。
預設精度值為0
。
moment . duration ( 123 , "minutes" ) . format ( "h [hrs]" ) ;
// "2 hrs"
正精度定義要顯示的小數位數。
moment . duration ( 123 , "minutes" ) . format ( "h [hrs]" , 2 ) ;
// "2.05 hrs"
負精確度定義要截斷為零的整數位數。
moment . duration ( 223 , "minutes" ) . format ( "m [min]" , - 2 ) ;
// "200 mins"
settings
是一個可以覆寫任何預設時刻持續時間格式選項的物件。
template
和precision
參數都可以指定為單一settings
物件參數的屬性,或者它們可以與可選設定物件一起單獨傳遞。
moment . duration ( 123 , "minutes" ) . format ( {
template : "h [hrs]" ,
precision : 2
} ) ;
// "2.05 hrs"
預設trim
行為是"large"
。
當最大數量的標記沒有價值時,它們會被自動修剪。
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" ) ;
// "2:03:00"
當格式字串以標記大小從左到右遞增的方式定向時,修剪也會起作用。
moment . duration ( 123 , "minutes" ) . format ( "s [seconds], m [minutes], h [hours], d [days]" ) ;
// "0 seconds, 3 minutes, 2 hours"
若要完全停止修剪,請設定{ trim: false }
。
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : false
} ) ;
// "0d 2:03:00"
當使用moment.duration.format
格式化多個持續時間時,所有持續時間的修剪將根據持續時間集的並集進行協調。
moment . duration . format ( [
moment . duration ( 1 , "minute" ) ,
moment . duration ( 1 , "hour" ) ,
moment . duration ( 1 , "day" )
] , "y [years], w [weeks], d [days], h [hours], m [minutes]" ) ;
// [
// "0 days, 0 hours, 1 minute",
// "0 days, 1 hour, 0 minutes",
// "1 day, 0 hours, 0 minutes"
// ]
trim
可以是字串、分隔的字串清單、字串陣列或布林值。接受的值如下:
"large"
修剪最大量值零值標記,直到找到具有值的標記、標識為stopTrim
標記或格式字串的最終標記。這是預設的trim
值。
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" ) ;
// "2:03:00"
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "large"
} ) ;
// "2:03:00"
moment . duration ( 0 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "large"
} ) ;
// "0"
"small"
修剪最小量值零值標記,直到找到具有值的標記、標識為stopTrim
標記或格式字串的最終標記。
moment . duration ( 123 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "small"
} ) ;
// "0d 2:03"
moment . duration ( 0 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "small"
} ) ;
// "0d"
"both"
執行"large"
修剪,然後執行"small"
修剪。
moment . duration ( 123 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "both"
} ) ;
// "2h 3m"
moment . duration ( 0 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "both"
} ) ;
// "0s"
"mid"
修剪不是第一個或最後一個標記的任何零值標記。通常與"large"
或"both"
連用。例如"large mid"
或"both mid"
。
moment . duration ( 1441 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "mid"
} ) ;
// "0w 1d 1m 0s"
moment . duration ( 1441 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "large mid"
} ) ;
// "1d 1m 0s"
moment . duration ( 1441 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "small mid"
} ) ;
// "0w 1d 1m"
moment . duration ( 1441 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "both mid"
} ) ;
// "1d 1m"
moment . duration ( 0 , "minutes" ) . format ( "w[w] d[d] h[h] m[m] s[s]" , {
trim : "both mid"
} ) ;
// "0s"
"final"
如果最終標記為零值,則修剪它。將此選項與"large"
或"both"
結合使用可在格式化零值持續時間時輸出空字串。例如"large final"
或"both final"
。
moment . duration ( 0 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "large final"
} ) ;
// ""
moment . duration ( 0 , "minutes" ) . format ( "d[d] h:mm:ss" , {
trim : "small final"
} ) ;
// ""
moment . duration ( 0 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "both final"
} ) ;
// ""
"all"
修剪所有零值標記。 "both mid final"
的簡寫。
moment . duration ( 0 , "minutes" ) . format ( "d[d] h[h] m[m] s[s]" , {
trim : "all"
} ) ;
// ""
"left"
對應到"large"
以支援此插件的版本 1 API。
"right"
對應到"large"
以支援此插件的版本 1 API。
true
映射到"large"
。
null
映射到"large"
。
false
禁用修剪。
將largest
設為正整數以僅輸出n
最大幅度矩標記,從具有值的最大幅度標記開始。
使用largest
選項預設trim
為"all"
。
moment . duration ( 7322 , "seconds" ) . format ( "d [days], h [hours], m [minutes], s [seconds]" , {
largest : 2
} ) ;
// "2 hours, 2 minutes"
moment . duration ( 1216800 , "seconds" ) . format ( "y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]" , {
largest : 3
} ) ;
// "2 weeks, 2 hours"
將trim
設定為不同的值或使用stopTrim
可以更改起始標記以及剩餘的輸出。
moment . duration ( 1216800 , "seconds" ) . format ( "y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]" , {
largest : 3 ,
trim : "both"
} ) ;
// "2 weeks, 0 days, 2 hours"
moment . duration ( 1216800 , "seconds" ) . format ( "y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]" , {
largest : 3 ,
trim : "both" ,
stopTrim : "m"
} ) ;
// "2 weeks, 0 days, 2 hours"
moment . duration ( 1216800 , "seconds" ) . format ( "y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]" , {
largest : 4 ,
trim : false