如何更改moment.js的语言?

我正在尝试更改moment.js设置的日期的语言。默认是英语,但我想设置德语。以下是我的尝试:

var now = moment().format("LLL").lang("de");

它给出NaN

var now = moment("de").format("LLL");

这甚至不是反应。

var now = moment().format("LLL", "de");

没有变化:这仍然是用英语生成的结果。

这怎么可能呢?

647876 次浏览

你需要时间。警告: lang()2.8.0时刻起已弃用,改用locale()):

moment.lang("de").format('LLL');

< a href = " http://momentjs.com/docs/ / i18n /”rel = " noreferrer " > http://momentjs.com/docs/ / i18n / < / >


从v2.8.1开始,moment.locale('de')设置了本地化,但不返回moment。一些例子:

var march = moment('2017-03')
console.log(march.format('MMMM')) // 'March'


moment.locale('de') // returns the new locale, in this case 'de'
console.log(march.format('MMMM')) // 'March' still, since the instance was before the locale was set


var deMarch = moment('2017-03')
console.log(deMarch.format('MMMM')) // 'März'


// You can, however, change just the locale of a specific moment
march.locale('es')
console.log(march.format('MMMM')) // 'Marzo'

总而言之,在全局moment上调用locale将为所有未来的moment实例设置语言环境,但不会返回moment实例。在实例上调用locale,为该实例设置它并返回该实例。

此外,正如Shiv在评论中所说,确保你使用的是“moment-with-locale .min.js”而不是“moment.min.js”,否则它将无法工作。

你需要在你的脚本中添加moment.lang(navigator.language)

并且必须添加你想要显示的每个国家的语言环境:例如GB或FR,你需要在moment.js库中添加该语言环境格式。在momentjs文档中可以找到这种格式的示例。如果你不在moment.js中添加这种格式,那么它总是会选择US locale,因为这是我目前看到的唯一一个。

使用momentjs 2.8+,执行以下操作:

moment.locale("de").format('LLL');

< a href = " http://momentjs.com/docs/ / i18n /”rel = " noreferrer " > http://momentjs.com/docs/ / i18n / < / >

最快的方法:使用Bower安装

我刚刚安装了时刻与bower和链接de.js作为javascript资源在我的html项目。

bower install moment --save

你也可以手动下载moment.jsde.js

在项目中链接“de.js”

在我的主项目文件中链接de.js会自动更改对moment类及其方法的所有访问的语言环境。

将有不再需要了来执行moment.locale("de").或 在源代码中的moment.lang("de").。< / p >

只需像这样链接你想要的地区:

<script src="/bower_components/moment/moment.js"></script>
<script src="/bower_components/moment/locale/de.js"></script>

或者你可以不使用bower_components路径链接库,如果你通过右键单击下载moment.js 1990ies样式,这在大多数情况下仍然可以正常工作。

流星用户:

时刻 locale不会在meteor中默认安装,只能在默认安装时获得'en' locale。

所以你使用的代码显示正确的其他答案:

moment.locale('it').format('LLL');

但在安装所需的区域设置之前,它将保持英文。

在meteor中有一种为时刻添加单独区域设置的好方法(由rzymek提供)。

以通常的流星方式安装时刻包:

meteor add rzymek:moment

然后添加你需要的语言环境,例如意大利语:

meteor add rzymek:moment-locale-it

或者如果你真的想添加所有可用的地区(添加大约30k到你的页面):

meteor add rzymek:moment-locales

哎呀,笔误了。我会解决这个问题: var moment = function(x) { return moment(x).locale('de'); }其他方法在某些条件下(对我来说)似乎不太管用

对于momentjs 2.12 +,执行以下操作:

moment.updateLocale('de');

还要注意,必须使用moment.updateLocale(localeName, config)来更改现有的区域设置。moment.defineLocale(localeName, config)只能用于创建一个新的区域设置。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MomentJS</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<script type="text/javascript" src="moment.js"></script>
<script type="text/javascript" src="locale/ne.js"></script>
</head>
<body>
<script>
jQuery(document).ready(function($) {
moment.locale('en'); // default the locale to English
var localLocale = moment();


moment.locale('ne'); // change the global locale to Nepalese
var ne1 = localLocale.format('LLLL');
var ne2 = moment().format('LLLL');


$('.ne1').text(ne1);
$('.ne2').text(ne2);
});
</script>
<p class="ne1"></p>
<p class="ne2"></p>
</body>
</html>

Demo

当我和gulp和朋友一起使用webpack时(这个发电机为我设置了一切),我不得不对凉亭进行更改。json文件。我必须重写当前包的默认导入,并选择所有语言附带的文件:

"overrides": {
"moment": {
"main": [
"min/moment-with-locales.min.js"
]
}
}

这是我的凉亭。json文件:

{
"name": "html5",
"version": "0.0.0",
"dependencies": {
"angular-animate": "~1.4.2",
"angular-cookies": "~1.4.2",
"angular-touch": "~1.4.2",
"angular-sanitize": "~1.4.2",
"angular-messages": "~1.4.2",
"angular-ui-router": "~0.2.15",
"bootstrap-sass": "~3.3.5",
"angular-bootstrap": "~0.13.4",
"malarkey": "yuanqing/malarkey#~1.3.1",
"angular-toastr": "~1.5.0",
"moment": "~2.10.6",
"animate.css": "~3.4.0",
"angular": "~1.4.2",
"lodash": "^4.13.1",
"angular-moment": "^0.10.3",
"angularLocalStorage": "ngStorage#^0.3.2",
"ngstorage": "^0.3.10"
},
"devDependencies": {
"angular-mocks": "~1.4.2"
},
"overrides": {
"bootstrap-sass": {
"main": [
"assets/stylesheets/_bootstrap.scss",
"assets/fonts/bootstrap/glyphicons-halflings-regular.eot",
"assets/fonts/bootstrap/glyphicons-halflings-regular.svg",
"assets/fonts/bootstrap/glyphicons-halflings-regular.ttf",
"assets/fonts/bootstrap/glyphicons-halflings-regular.woff",
"assets/fonts/bootstrap/glyphicons-halflings-regular.woff2"
]
},
"moment": {
"main": [
"min/moment-with-locales.min.js"
]
}
},
"resolutions": {
"angular": "~1.4.2"
}
}

我使用的是angular2-moment,但用法必须相似。

import { MomentModule } from "angular2-moment";
import moment = require("moment");


export class AppModule {


constructor() {
moment.locale('ru');
}
}

根据版本更改moment js语言

版本:2.8 +

moment.locale('嗨');

版本:2.5.1

moment.lang('嗨');

return moment(status.created_at).locale('es').fromNow();这样工作很好

我还必须导入语言:

import moment from 'moment'
import 'moment/locale/es'  // without this line it didn't work
moment.locale('es')

然后像平常一样利用这一刻

console.log(moment(date).fromNow())

在2.18.1秒之后:

  moment.locale("de");
var m = moment().format("LLL")

2017 / 2018年底:其他答案有太多的旧代码需要编辑,所以这里是我的另一个干净的答案:

与要求

let moment = require('moment');
require('moment/locale/fr.js');
// or if you want to include all locales:
require("moment/min/locales.min");

与进口

import moment from 'moment';
import 'moment/locale/fr';
// or if you want to include all locales:
require("moment/min/locales.min");

使用:

moment.locale('fr');
moment().format('D MMM YY');  // Correct, set default global format
// moment.locale('fr').format('D MMM YY') //Wrong old versions for global default format

和时区

*要求:

require('moment-range');
require('moment-timezone');

*进口:

import 'moment-range';
import 'moment-timezone';

使用区域:

const newYork    = moment.tz("2014-06-01 12:00", "America/New_York");
const losAngeles = newYork.clone().tz("America/Los_Angeles");
const london     = newYork.clone().tz("Europe/London");

格式化日期的函数

const ISOtoDate = function (dateString, format='') {


// if date is not string use conversion:
// value.toLocaleDateString() +' '+ value.toLocaleTimeString();


if ( !dateString ) {
return '';
}


if (format ) {
return moment(dateString).format(format);
} else  {
return moment(dateString);  // It will use default global format
}
};

对我来说,有一些改变要做。2.20)

  1. 你用moment.locale('de')设置locale,然后用moment()(注意括号)创建一个表示现在日期的新对象,然后用format('LLL')它。括号很重要。

这意味着:

moment.locale('de');
var now = moment();
now.format('LLL');
  1. 另外,记得使用moment-with-locale.js。该文件包含所有语言环境信息,文件大小较大。下载locale文件夹是不够的。如有必要,将名称更改为moment.js。Django只是拒绝加载moment-with-locale.js在我的情况下。
< p >编辑: 结果证明,重命名文件是不必要的。我只是忘记在页面中调用它,所以Django不认为加载它是必要的,所以是我的错

这是通过自动检测当前用户位置来工作的。

import moment from "moment/min/moment-with-locales";


// Then use it as you always do.
moment(yourDate).format("MMMM Do YYYY, h:mm a")

对于那些在异步环境中工作的人来说,moment在按需加载区域设置时表现异常。

而不是

await import('moment/locale/en-ca');
moment.locale('en-ca');

颠倒顺序

moment.locale('en-ca');
await import('moment/locale/en-ca');

似乎locale被加载到当前选定的locale中,覆盖了之前设置的任何locale信息。所以先切换语言环境,再加载语言环境信息不会导致这个问题。

我不知道发生了什么变化,但像这样导入语言文件对我有用

import 'moment/src/locale/fr';
moment.locale('fr')

注意import语句中的src

在挣扎之后,这对我来说适用于moment v2.26.0:

import React from "react";
import moment from "moment";
import frLocale from "moment/locale/fr";
import esLocale from "moment/locale/es";


export default function App() {
moment.locale('fr', [frLocale, esLocale]) // can pass in 'en', 'fr', or 'es'
  

let x = moment("2020-01-01 00:00:01");
return (
<div className="App">
{x.format("LLL")}
<br />
{x.fromNow()}
</div>
);
}

你可以传入enfres。如果需要另一种语言,则必须导入区域设置并将其添加到数组中。

如果你只需要支持一种语言,那就更简单了:

import React from "react";
import moment from "moment";
import "moment/locale/fr"; //always use French


export default function App() {
let x = moment("2020-01-01 00:00:01");
return (
<div className="App">
{x.format("LLL")}
<br />
{x.fromNow()}
</div>
);
}

——更新——

在一种情况下,像上面那样导入所有的语言环境文件将使用最后导入区域始终被使用(即"es"在上面的例子中),即使我把它设置为"fr"。似乎有效的解决方案是:

import moment from 'moment';
import 'moment/min/locales';


...


moment.locale('fr');

First Call, p5.js和moment-with-locale .js,然后像下面这样做代码,你会得到你的结果。

在这个结果中,我用不同的语言显示了月份名称:)

请检查代码:

     var monthNameEnglish = moment().locale('en-gb').format('MMMM');
document.getElementById('monthNameEnglish').innerHTML =  monthNameEnglish;
    

    

var monthNameGerman = moment().locale('de').format('MMMM');
document.getElementById('monthNameGerman').innerHTML =  monthNameGerman;
<!DOCTYPE html>
<html>
<head>
<title>P5.js and Moment.js</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.16/p5.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.4/moment-with-locales.js"></script>
    

<h3>English Version Month Name</h3>
    

<p id="monthNameEnglish"></p>
    

<h3> German Version Month Name</h3>
    

<p id="monthNameGerman"></p>
        

</head>
<body>
</body>
</html>

要使用moment(2.8.0之后的版本)更改区域设置,请执行以下步骤。

  1. 在index.html中加载时刻语言环境文件,如下所示 <script src="../node_modules/moment/locale/it.js"></script> < / p >

  2. 根据需要设置locale - moment.locale('it');

  3. 现在moment.locale()返回"it"

  4. 你可以在任何语言中使用moment,比如- JavaScript, node等。

我们可以使用moment.locale()方法来传递您自己的语言ex。我使用window.navigator.language (ex.en- us)在运行时传递lange。

const formatDate = date => moment(date).locale(window.navigator.language).format('LL')