Moment.js 文档

字符串 + 格式 1.0.0+

moment(String, String);
moment(String, String, String);
moment(String, String, String[]);
moment(String, String, Boolean);
moment(String, String, String, Boolean);

如果你知道输入字符串的格式,则可以使用它来解析 moment。

moment("12-25-1995", "MM-DD-YYYY");

默认情况下,解析器会忽略非字母数字字符,因此以下两个将返回相同的内容。

moment("12-25-1995", "MM-DD-YYYY");
moment("12/25/1995", "MM-DD-YYYY");

解析日期和时间时,你可能会得到意想不到的结果。 下面的示例可能不会像你预期的那样解析:

moment('24/12/2019 09:15:00', "DD MM YYYY hh:mm:ss");

你可以使用严格模式,它将识别解析错误并将 Moment 对象设置为无效:

moment('24/12/2019 09:15:00', "DD MM YYYY hh:mm:ss", true);

解析标记类似于 moment#format 中使用的格式化标记。

年、月、日标记

令牌区分大小写。

输入例子描述
YYYY20144 或 2 位数年份。 注意: strict 模式只能解析 4 位
YY142 位数年份
Y-25带有任意数字和符号的年份
Q1..4季度。 将月份设置为季度的第一个月。
M MM1..12月份
MMM MMMMJan..Decembermoment.locale() 设置的语言环境中的月份名称
D DD1..31一个月中的第几天
Do1st..31st带序号的月份中的第几天
DDD DDDD1..365一年中的某一天
X1410715640.579Unix 时间戳
x1410715640579Unix 毫秒时间戳

2.10.5 版本的 YYYY 在非 strict 模式下支持 2 位数年份,并将它们转换为接近 2000 的年份(与 YY 相同)。

2.11.1 中添加了 Y。 它将匹配任何有符号或无符号的数字。 对于不是 4 位数字或纪元之前的年份很有用。 它可以用于任何一年。

周年、周和工作日标记

对于这些,小写标记使用区域设置感知周开始日期,大写标记使用 ISO 周日期 开始日期。

令牌区分大小写。

输入例子描述
gggg2014区域设置 4 位数星期年份
gg14区域设置 2 位数周年
w ww1..53一年中的语言环境周
e0..6星期几
ddd ddddMon...Sundaymoment.locale() 设置的语言环境中的日期名称
GGGG2014ISO 4 位数周年
GG14ISO 2 位数周年
W WW1..53一年中的 ISO 周
E1..7ISO 星期几

语言环境感知格式

使用 LT LTS L LL LLL LLLL 也可以使用区域设置感知日期和时间格式。 它们是在版本 2.2.1 中添加的,但 LTS 是在 2.8.4 中添加的。

令牌区分大小写。

输入例子描述
L09/04/1986日期(本地格式)
LLSeptember 4 1986月份、月日、年
LLLSeptember 4 1986 8:30 PM月份、月日、年、时间
LLLLThursday, September 4 1986 8:30 PMDay of week, month name, day of month, year, time
LT8:30 PM时间(不含秒)
LTS8:30:00 PM时间(秒)

小时、分钟、秒、毫秒和偏移标记

令牌区分大小写。

输入例子描述
H HH0..23小时(24 小时制)
h hh1..12小时(与 a A 一起使用的 12 小时时间。)
k kk1..24小时(24 小时制,从 1 到 24)
a Aam pm子午线前后(注意一个字符 a p 也被认为是有效的)
m mm0..59分钟
s ss0..59
S SS SSS ... SSSSSSSSS0..999999999小数秒
Z ZZ+12:00与 UTC 的偏移量为 +-HH:mm+-HHmmZ

从版本 2.10.5 开始: 小数秒标记长度为 4 到 9 可以解析任意数量的数字,但只会考虑前 3 个(毫秒)。 如果你的时间打印有很多小数位并且想要使用输入,请使用。

请注意,提供的 S 字符数仅在以严格模式解析时才相关。 在标准模式下,SSSSSSSSSS 都是等价的,并被解释为秒的小数部分。 例如,.12 始终为 120 毫秒,传递 SS 不会导致它被解释为 12 毫秒。

Z ZZ 已添加到版本 1.2.0 中。

S SS SSS 已添加到版本 1.6.0 中。

X 是在版本 2.0.0 中添加的。

SSSSS ... SSSSSSSSS 已添加到版本 2.10.5 中。

k kk 已添加到版本 2.13.0 中。

除非你指定时区偏移量,否则解析字符串将在当前时区中创建一个日期。

moment("2010-10-20 4:30",       "YYYY-MM-DD HH:mm");   // parsed as 4:30 local time
moment("2010-10-20 4:30 +0000", "YYYY-MM-DD HH:mm Z"); // parsed as 4:30 UTC

纪元年相关令牌

令牌区分大小写。

输入例子描述
y .. yyyy5 +5 -500
yo5th 1st序数年
NAD缩写年号
NNAD缩写年号
NNNAD缩写年号
NNNNAnno Domini全纪元名称
NNNNNAD狭义时代名称

2.25.0 中添加了时代支持。 令牌/API 仍在不断变化。

注意事项和陷阱

如果解析输入产生的 moment 不存在,moment#isValid 将返回 false。

moment("2010 13",           "YYYY MM").isValid();     // false (not a real month)
moment("2010 11 31",        "YYYY MM DD").isValid();  // false (not a real day)
moment("2010 2 29",         "YYYY MM DD").isValid();  // false (not a leap year)
moment("2010 notamonth 29", "YYYY MMM DD").isValid(); // false (not a real month name)

从版本 2.0.0 开始,区域设置密钥可以作为第三个参数传递给 moment()moment.utc()

moment('2012 juillet', 'YYYY MMM', 'fr');
moment('2012 July',    'YYYY MMM', 'en');
moment('2012 July',    'YYYY MMM', ['qj', 'en']);

Moment 的解析器非常宽容,这可能会导致不希望的/意外的行为。

例如,可以观察到以下行为:

moment('2016 is a date', 'YYYY-MM-DD').isValid() //true, 2016 was matched

2.13.0 之前,解析器表现出以下行为。 这已得到纠正。

moment('I am spartacus', 'h:hh A').isValid();     //true - the 'am' matches the 'A' flag.

从版本 2.3.0 开始,你可以为最后一个参数指定一个布尔值,以使 Moment 使用严格解析。 严格解析要求格式和输入完全匹配,包括分隔符。

moment('It is 2012-05-25', 'YYYY-MM-DD').isValid();       // true
moment('It is 2012-05-25', 'YYYY-MM-DD', true).isValid(); // false
moment('2012-05-25',       'YYYY-MM-DD', true).isValid(); // true
moment('2012.05.25',       'YYYY-MM-DD', true).isValid(); // false

你可以同时使用语言环境和严格性。

moment('2012-10-14', 'YYYY-MM-DD', 'fr', true);

严格解析通常是最好的解析选项。 有关选择严格解析与宽容解析的更多信息,请参阅 解析指南。

解析两位数年份

默认情况下,假定 68 岁以上的两位数年份在 1900 年代,而 68 岁或以下的年份则假定在 2000 年代。 这可以通过替换 moment.parseTwoDigitYear 方法来更改。 此方法的唯一参数是一个包含用户输入的两年的字符串,应该以整数形式返回年份。

moment.parseTwoDigitYear = function(yearString) {
    return parseInt(yearString) + 2000;
}

解析粘附的小时和分钟

从版本 2.11.0 开始支持解析 hmmHmmhmmssHmmss

moment("123", "hmm").format("HH:mm") === "01:23"
moment("1234", "hmm").format("HH:mm") === "12:34"