时刻持续时间对象的格式插件。
这是 Moment.js JavaScript 日期库的插件,用于向 Moment 持续时间添加全面的格式设置。
格式模板语法以现有的 Moment Date 格式模板语法为模式,并进行了一些修改,因为持续时间与日期根本不同。
该插件除了 Moment.js 本身之外没有任何依赖项,可以在浏览器和 Node.js 中使用。
在可用且功能正常的情况下,该插件使用Intl.NumberFormat#format
或Number#toLocaleString
来呈现格式化的数字输出。不幸的是,许多环境没有完全实现各自规范中的全套选项,并且有些环境提供了有缺陷的实现。
该插件对每个格式化程序运行功能测试,如果功能测试失败,将恢复为后备函数以呈现格式化的数字输出。要强制此插件始终使用后备数字格式功能,请将useToLocaleString
设置为false
。可以使用本页底部详细说明的选项来本地化后备数字格式函数输出。一般来说,如果默认的"en"
区域设置格式在某些设备或某些环境中不可接受,您应该指定后备数字格式选项。
该插件使用 BrowserStack 在一系列操作系统版本为 2.2 至 7 的 Android 设备以及操作系统版本为 4.3 至 11 的一系列 iOS 设备上进行了测试。还在 Chrome、Firefox、IE 8-11 和 Edge 浏览器上进行了测试。
如果您在任何环境中发现格式问题或异常,请提出问题!
版本 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