我有一个奇怪的问题,我无法解释:
我有约会:Wed Feb 28 2018 16:24:37 GMT+0100 (CET)
当我添加import 'moment/locale/fr';
时,同一日期变成Sun Jan 28 2018 16:24:37 GMT+0100 (CET)
谁能解释我做错了什么?
这是完整的例子
import React from 'react';
import moment from 'moment';
// ====== adding locale break the date ======= //
// import 'moment/locale/fr';
// time value is : Wed Feb 28 2018 16:24:37 GMT+0100 (CET)
const Time = ({ time }) => (
<p>
{moment(time).format('DD-MM-YYYY HH:mm:ss')}
</p>
);
// output without locale/fr is : 28-02-2018 16:24:37
// output with locale/fr is : 28-01-2018 16:24:37
之后我将使用.fromNow()
moment函数来显示现在和给定时间之间的时间距离。
如果在不提供输入格式的情况下解析字符串,则moment.js首先尝试ISO 8601格式。如果它不匹配,它将回退到内置解析器。您应该收到警告,不要这样做(因为这是一个坏主意)。
如果您提供解析格式('ddd MMM DD YYYY HH:mm:ss ZZ'),并且区域设置文件为法语,并且未指定输入字符串为英语,则该字符串似乎被解析为好像是法语并且“Feb”被解析为“janvier”(1月)而不是février(2月)。
您需要提供输入字符串的解析格式和语言:
moment('Wed Feb 28 2018 16:24:37 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss ZZ', 'en')
// Without providing parse format
console.log(moment('Wed Feb 28 2018 16:24:37 GMT+0100 (CET)').format('DD-MM-YYYY HH:mm:ss'));
// With parse format but not input langauge
console.log(moment('Wed Feb 28 2018 16:24:37 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss ZZ').format('DD-MM-YYYY HH:mm:ss'));
// With parse format and input langauge (recommended approach)
console.log(moment('Wed Feb 28 2018 16:24:37 GMT+0100 (CET)', 'ddd MMM DD YYYY HH:mm:ss ZZ', 'en').format('DD-MM-YYYY HH:mm:ss'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/locale/fr.js"></script>
尝试这样的事情(我们需要从moment/locale/fr
导入以确保它在客户端加载)。所以用英语解析,然后将语言环境切换到你需要的语言环境,然后用fromNow
输出时差:
import moment from 'moment';
import momentFr from 'moment/locale/fr';
const Time = ({ time }) => (
<p>
{moment(time, 'ddd MMM DD YYYY HH:mm:ss Z').locale('fr').fromNow()}
</p>
);