Moment
作者:高天阳
邮箱:13683265113@163.com
1. 简介
1.1 什么是Moment
Moment旨在在浏览器和Node.js中工作。
目前,以下浏览器用于ci系统:Windows 7上的IE8,IE9,Windows XP上的稳定Chrome, Mac上的Safari 10.8和Linux上的稳定Firefox。
所有代码都适用于这两种环境。所有单元测试都在两种环境中运行。
moment.js不依赖任何第三方库,支持字符串、Date、时间戳以及数组等格式, 可以像PHP的date()函数一样,格式化日期时间,计算相对时间,获取特定时间后的日期时间等等。
2. 安装和使用
2.1 安装
2.1.1 Node.js
注意:在
2.4.0
版本,不推荐使用全局导出的时刻对象。它将在下一个主要版本中删除。
2.1.2 script标签引入
注意:
Moment.js
可在cdnjs.com
上找到。但请记住将他们的script
标签串联以最小化http请求。
2.1.3 Bower
注意:moment.js,locale/*.js和min/moment-with-locales.js。
2.1.4 Require.js
Moment仍将创建一个moment
全局,这对插件和其他第三方代码很有用。如果您希望压缩全局,请使用noGlobal
模块配置中的选项。
如果未指定,noGlobal
则全局导出的时刻将打印弃用警告。从下一个主要版本开始,如果你想要这种行为,你必须自己导出它。
对于版本2.5.x
,如果您使用其他依赖Moment但不兼容AMD的插件,则可能需要添加wrapShim: true
到r.js
配置中。
注意:要允许在requirejs环境中加载moment.js插件,请将时刻创建为命名模块。正因为如此,时刻必须被加载完全一样的"moment",用paths确定的目录。需要时刻与路径一样"vendor\moment"将返回undefined。
注意:从版本2.9.0开始,将自身导出为匿名模块,因此如果您只使用核心(没有区域设置/插件),那么如果将其放在非标准位置,则不需要配置。
2.1.5 NuGet
2.1.6 spm
2.1.7 meteor
2.2 使用
Date.prototypeMoment.js
不是修改本机日期,而是为Date
对象创建一个包装器。 要获取此包装器对象,只需moment()
使用其中一种受支持的输入类型进行调用即可。
该Moment
原型是通过暴露moment.fn
。如果你想添加自己的功能,那就是你要放置它们的地方。
为便于参考,Moment.prototype
将在文档中引用任何方法moment#method
。 所以Moment.prototype.format
=== moment.fn.format
=== moment#format
。
2.2.1 当前时间 1.0.0+
1.0.0+
要获取当前日期和时间,只需moment()使用无参数调用即可。
这与调用moment(new Date())
基本相同。
格式化日期1995-12-25
。
2.2.2 字符串 1.0.0+
1.0.0+
从字符串创建时刻时,我们首先检查字符串是否与已知的ISO 8601格式匹配, 然后在new Date(string)
找不到已知格式时返回。
警告:浏览器对解析字符串支持不一致。
由于没有关于应支持哪种格式的规范,因此在某些浏览器中有效的功能将无法在其他浏览器中使用。
为了解析除ISO 8601字符串以外的任何其他内容的一致结果, 您应该使用String + Format。
支持的ISO 8601字符串
ISO 8601字符串需要日期部分。
还可以包括时间部分,通过空格或大写T与日期部分分开。
任何日期部分都可以包含时间部分。
如果一个时间部分被包括,一个从UTC偏移量也可被包括为+-HH:mm
,+-HHmm
,或Z
。
注意:1.5.0版中添加了自动跨浏览器ISO-8601支持。版本2.3.0中添加了对星期和序数格式的支持。
如果字符串与上述任何格式都不匹配且无法解析
Date.parse
,moment#isValid
则返回false。
2.2.3 字符串+格式 1.0.0+
1.0.0+
如果您知道输入字符串的格式,可以使用它来解析片刻。
解析器忽略非字母数字字符,因此以下两个都将返回相同的内容。
解析令牌类似于使用的格式化令牌moment#format
。
年,月,日缩写
输入 | 输出 | 描述 |
|
| 4或2位数年份 |
|
| 2位数年份 |
|
| 一年四分之一。将季度设置为季度的第一个月。 |
|
| 月份编号 |
|
| 设置的语言环境中的月份名称 moment.locale() |
|
| 一个月的一天 |
|
| 有序的月份日 |
|
| 一年的一天 |
|
| Unix时间戳 |
|
| Unix ms时间戳 |
YYYY
从版本2.10.5
支持2位数年份,并将它们转换为2000年附近的一年(相同YY
)。
周年,周和工作日缩写
对于这些,小写标记使用区域设置感知周开始日期,而大写标记使用ISO周日期开始日期。
输入 | 输出 | 描述 |
|
| Locale 4位数周 |
|
| Locale 2位数周 |
|
| 一年中的地方周 |
|
| 区域日期 |
|
| 设置的语言环境中的月份名称 moment.locale() |
|
| ISO 4位数周 |
|
| ISO 2位数周 |
|
| ISO周一年 |
|
| ISO星期几 |
小时,分钟,秒,毫秒和偏移缩写
输入 | 输出 | 描述 |
|
| 24小时的时间 |
|
| 使用12小时的时间a A。 |
|
| 张贴或赌注meridiem |
|
| 分钟 |
|
| 秒 |
|
| 十分之一秒 |
|
| 百分之一秒 |
|
| 千分之一秒 |
|
| 毫秒 |
|
| 从UTC偏移量+-HH:mm,+-HHmm或Z |
从版本2.10.5
:小数秒标记长度4到9可以解析任意数量的数字,但只考虑前3(毫秒)。如果您有时间打印了许多小数位并想要消耗输入,请使用。
还可以使用区域设置感知日期和时间格式LT LTS L LL LLL LLLL
。它们是在2.2.1
版本中添加的,除了LTS
增加了 2.8.4
。
Z ZZ
在版本中添加1.2.0
。
S SS SSS
在版本中添加1.6.0
。
X
在版本中添加2.0.0
。
除非指定时区偏移量,否则解析字符串将在当前时区中创建日期。
如果由解析的输入产生的时刻不存在,moment#isValid
则返回false。
从版本开始2.0.0
,可以将区域设置键作为第三个参数传递给moment()
和moment.utc()
。
Moment的解析器非常宽容,这可能会导致不良行为。从版本开始2.3.0
,您可以为最后一个参数指定一个布尔值, 以使Moment使用严格的解析。严格的解析要求格式和输入完全匹配。
您可以同时使用区域设置和严格性。
解析两位数年份
默认情况下,68岁以上的两位数年份假定为1900年,68年或以下年份假定为2000年。可以通过替换moment.parseTwoDigitYear
方法来更改此设置。
2.2.4 格式化时间 1.0.0+
1.0.0+
描述 | 输入 | 输出 |
Month |
|
|
Month |
|
|
Month |
|
|
Month |
|
|
Month |
|
|
Quarter |
|
|
Day of Month |
|
|
Day of Month |
|
|
Day of Month |
|
|
Day of Year |
|
|
Day of Year |
|
|
Day of Year |
|
|
Day of Week |
|
|
Day of Week |
|
|
Day of Week |
|
|
Day of Week |
|
|
Day of Week |
|
|
Day of Week (Locale) |
|
|
Day of Week (ISO) |
|
|
Week of Year |
|
|
Week of Year |
|
|
Week of Year |
|
|
Week of Year (ISO) |
|
|
Week of Year (ISO) |
|
|
Week of Year (ISO) |
|
|
Year |
|
|
Year |
|
|
Week Year |
|
|
Week Year |
|
|
Week Year (ISO) |
|
|
Week Year (ISO) |
|
|
AM/PM |
|
|
AM/PM |
|
|
Hour |
|
|
Hour |
|
|
Hour |
|
|
Hour |
|
|
Minute |
|
|
Minute |
|
|
Second |
|
|
Second |
|
|
Fractional Second |
|
|
Fractional Second |
|
|
Fractional Second |
|
|
Fractional Second |
|
|
Timezone |
|
|
Timezone |
|
|
Timezone |
|
|
Unix Timestamp |
|
|
Unix Millisecond Timestamp |
|
|
2.2.5 时差(之前,现在为基准) 1.0.0+
1.0.0+
显示时间的常用方法由处理moment#fromNow
。这有时被称为timeago或相对时间。
如果通过true,则可以获得不带后缀的值。
描述 | 输入 | 输出 |
0 to 45 seconds |
|
|
45 to 90 seconds |
|
|
90 seconds to 45 minutes |
|
|
45 to 90 minutes |
|
|
90 minutes to 22 hours |
|
|
22 to 36 hours |
|
|
36 hours to 25 days |
|
|
25 to 45 days |
|
|
45 to 345 days |
|
|
345 to 545 days (1.5 years) |
|
|
546 days+ |
|
|
2.2.6 时差(之前) 1.0.0+
1.0.0+
您可能希望显示与现在不同的时间相关的时刻。在这种情况下,您可以使用moment#from
。
第一个参数是您可以传递给的任何参数moment()
或实际参数Moment
。
比如moment#fromNow
,传递true
第二个参数返回没有后缀的值。只要您需要具有人类可读的时间长度,这就非常有用。
2.2.7 时差(毫秒) 1.0.0+
1.0.0+
要获得以毫秒为单位的差异,请moment#diff
像使用一样使用moment#from
。
为了获得另一个测量单位的差异,将该测量值作为第二个参数传递。
支持的测量包括年,月,周,日,小时,分钟和秒。为了便于开发,从2.0.0开始支持单数形式。版本1.1.1中提供了毫秒以外的度量单位。
默认情况下,moment#diff
将向下舍入数字。如果需要浮点数,则传递true
为第三个参数。 在2.0.0之前,moment#diff
返回舍入的数字,而不是向下舍入的数字。
如果时刻早于您传递的时刻moment.fn.diff
,则返回值将为负数。
想到这一点的简单方法是用.diff(
减号运算符替换。
月和年的差异
moment#diff
有一些特殊的处理月和年差异。它经过优化,可确保相同日期的两个月始终是一个整数。
所以1月15日到2月15日应该是1个月。
2月28日至3月28日应该是1个月。
2011年2月28日至2012年2月28日应该是1年。
请在此处查看有关月份和年度差异的更多讨论
月份和年份差异的变化是在2.0.0中进行的。截至2.9.0版本,差异也支持季度单位。
2.2.8 操纵时间(加法) 1.0.0+
1.0.0+
通过增加时间来改变原始时刻。
这是一个非常强大的功能,可以为现有时刻增加时间。要添加时间,请传递要添加的时间键以及要添加的金额。
如果你涉及整个简洁的事情,也有一些速记键。
描述 | 输入 |
years |
|
quarters |
|
months |
|
weeks |
|
days |
|
hours |
|
minutes |
|
seconds |
|
milliseconds |
|
如果要同时添加多个不同的键,可以将它们作为对象文字传递。
金额没有上限,因此您可以重载任何参数。
几个月和几年的特殊考虑
如果原始日期的月份日期大于最后一个月的天数,则该月的日期将更改为最后一个月的最后一天。
在添加跨越夏令时的时间时,还要特别注意。如果您要添加年,月,周或天,则原始小时将始终与添加的小时相匹配。
如果要添加小时,分钟,秒或毫秒,则假设您需要精确到小时,并且将导致不同的小时。
或者,您可以使用持续时间添加到时刻。
在版本之前2.8.0
,moment#add(String, Number)
还支持语法。它已经被弃用了moment#add(Number, String)
。
2.2.9 操纵时间(减法) 1.0.0+
1.0.0+
通过减去时间来改变原始时刻。
这与完全相同moment#add
,只是减去时间,而不是增加时间。
在版本之前2.8.0
,moment#subtract(String, Number)
还支持语法。它已经被弃用了moment#subtract(Number, String)
。
2.2.10 开始时间 1.7.0+
1.7.0+
通过将其设置为单位时间的开始来突变原始时刻。
这些快捷方式基本上与以下内容相同。
从版本2.0.0开始,moment#startOf('day')
替换moment#sod
。
注意: moment#startOf('week')
在2.0.0版中添加了。
从版本2.1.0开始,moment#startOf('week')
使用区域设置感知周开始日。
注意: moment#startOf('isoWeek')
在2.2.0版中添加了。
2.2.11 结束时间 1.7.0+
1.7.0+
通过将其设置为单位时间的结尾来突变原始时刻。
这与moment#startOf
仅设置为单位时间的开始,而不是设置为单位时间的结束。
从版本2.0.0开始,moment#endOf('day')
替换moment#eod
。
注意: moment#endOf('week')
在2.0.0版中添加了。
从版本2.1.0开始,moment#endOf('week')
使用区域设置感知周开始日。
参考资料
Last updated