MomentJS:如何解析 MM/DD/YYYY 和 DD/MM/YYYY 格式的日期

13

如何在澳大利亚和美国的时间格式中同时使用moment.js?

例如:

07/08/2017 - 对于两种时间格式都可以使用,但是!

30/08/2017 - 对于moment.js来说是无效的,但我可以有这样的日期时间。

您可以在此处进行检查:

http://jsfiddle.net/rLjQx/2135/


1
请注意,虽然07/08/2017在两种格式中都是有效的,但它代表着完全不同的日期(7月8日和8月7日)。 - Matt Johnson-Pint
3个回答

18
解析器假设形如XX-XX-XXXX的数字表示DD-MM-YYYY。如果您想让它接受MM-DD-YYYY,则需要指定这一点。例如:var now2 = moment('08/30/2017', 'MM-DD-YYYY').format('MMM DD h:mm A');。您还可以指定一个包含不同格式的数组,以便它能够识别两种格式: var now2 = moment('08/30/2017', ['DD-MM-YYYY', 'MM-DD-YYYY']).format('MMM DD h:mm A');

+1,但请注意moment解析器(使用最新版本)仅回退到 new Date(string) ,这是依赖于浏览器的(因此不一致)。此外,请在您的样例中修正格式,因为您使用了-而不是 /,并且请注意对于模棱两可的输入(例如问题中提到的07/08/2017),格式顺序很重要。 - VincenzoC
解析器忽略非字母数字字符。 - Billy Reilly
当然,但是如果你添加第三个参数启用严格解析,你将得到一个无效的日期。我认为使用['DD/MM/YYYY', 'MM/DD/YYYY']比使用['DD-MM-YYYY', 'MM-DD-YYYY']没有任何好处,这就是我指出它的原因 :)。 - VincenzoC
1
值得一提的是,数组中第一个有效匹配模式将被使用。例如对于 07/08/2017,该代码将把其解释为8月7日。 - Matt Johnson-Pint

6

现在怎么称呼它?像moment()一样但带有格式吗? - brabertaser19
我需要类似于:moment(now, 'DD/MM') 的东西。 - brabertaser19
我觉得这是一个不同的问题,但我认为你正在寻找: moment().format('DD/MM');新的 moment 默认使用浏览器提供的当前日期/时间。 - emd
moment().format('DD/MM') 将输出字符串... 而不是对象。 - brabertaser19
所以你只是想要当前日期/时间的一刻?那就是 moment(); - emd
@brabertaser19 - 这是不可能的。只有字符串才有格式。 - Matt Johnson-Pint

4
在你的代码里,你使用了一个非常旧的 moment 版本(2.2.1),我建议升级到最新版 (2.18.1)。
如果使用较新版本,你将在控制台收到 Deprecation Warning (弃用警告):

Deprecation warning: value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.

根据链接 (moment(String) 文档) 中的提示,你需要指定格式以正确解析字符串。
如 Billy Reilly 所建议,你可以使用 moment(String, String[]) 解析函数。请注意以下几点:

从版本 2.3.0 开始,Moment 使用一些简单的启发式方法来确定要使用哪个格式。按以下顺序:

  • 首选能生成有效日期而不是无效日期的格式。
  • 首选解析更多字符串而非更少的格式,即首选更严格的解析。
  • 更喜欢数组中格式更早的元素。
因此,07/08/2017 的解释方式取决于 格式数组 参数中格式的顺序。
以下是一些示例代码:

var now = moment('30/08/2017', ['MM/DD/YYYY','DD/MM/YYYY']);
var now2 = moment('08/30/2017', ['MM/DD/YYYY','DD/MM/YYYY']);
var now3 = moment('07/08/2017', ['MM/DD/YYYY','DD/MM/YYYY']);

console.log(now.format('MMM DD h:mm A')); // Aug 30 12:00 AM
console.log(now2.format('MMM DD h:mm A'));// Aug 30 12:00 AM
console.log(now3.format('MMM DD h:mm A'));// Jul 08 12:00 AM

var now4 = moment('30/08/2017', ['DD/MM/YYYY','MM/DD/YYYY']);
var now5 = moment('08/30/2017', ['DD/MM/YYYY','MM/DD/YYYY']);
var now6 = moment('07/08/2017', ['DD/MM/YYYY','MM/DD/YYYY']);

console.log(now4.format('MMM DD h:mm A')); // Aug 30 12:00 AM
console.log(now5.format('MMM DD h:mm A')); // Aug 30 12:00 AM
console.log(now6.format('MMM DD h:mm A')); // Aug 07 12:00 AM
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接