添加时刻区域设置会中断初始日期

时间:2018-02-28 17:28:02

标签: javascript reactjs date momentjs locale

我有一个奇怪的问题,我无法解释:

我有我的约会对象: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()时刻功能显示现在和给定时间之间的时间距离。

2 个答案:

答案 0 :(得分:2)

如果在不提供输入格式的情况下解析字符串,则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>

答案 1 :(得分:0)

尝试这样的事情(我们需要从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>
);