使用momentjs

时间:2017-07-21 08:53:50

标签: javascript internationalization momentjs

Moment.js有一种方便的格式(lLllLLlllLLL,{{1 }和llll)用于格式化当前语言环境中的日期。

问题是这种格式包括日期。例如,LLLL将输出为moment('1986-02-05').format('LL')

这对我不起作用的原因是我只想显示当天,只显示月份。用英语February 5, 1986

是否有根据区域设置仅格式化月份和年份的方法?如果不是与momentjs,与任何其他库。我还会链接到我可以传递给February 1896的常用语言区域的字符串列表。

2 个答案:

答案 0 :(得分:0)

请参阅以下代码以获取所需格式,它将起作用:

moment.locale('en');
var date = moment(new Date());
console.log(date.format('MMMM YYYY'));

答案 1 :(得分:-1)

请参阅momentjs format()文档,了解可用于显示日期和时间的令牌列表。

在您的情况下,相关令牌的月份名称为MMM,年份为YYYY。不要忘记加载您需要使用的每个语言环境,如here所述。

您可以使用locale()函数更改给定时刻实例的区域设置,如果需要,可以使用moment.locale change locale globally

修改

没有内置方法来获取您要查找的本地化输入,但您可以使用localeDatalongDateFormat来获取LL的本地化格式(月份名称,月份日期,年份)然后操纵剥离月份日期部分。以下代码段适用于许多区域设置,但它不显示每个区域设置的预期输出(某些区域设置失败:eseult,...)。

我的建议是定义受支持的语言环境的子集,并手动定义边缘情况的格式。

function getMonthYear(value){
  moment.locale(value);
  
  // Get locale data
  var localeData = moment.localeData();
  var format = localeData.longDateFormat('LL');
  
  // Manage custom cases
  if( value === 'br'){
    format = 'MMMM YYYY';
  }
  if( value === 'en-ca'){
    format = 'MMMM, YYYY';
  }
  // if( value === ...) possible other cases
  
  // Check locale format and strip day from the first part
  if( format.match(/^D/g) ){
    format = format.replace(/^D\./, '').replace(/^D/, '');
  }
  format = format.trim();

  return moment('1986-02-05').format(format);
}

['af' , 'ar-dz', 'ar-kw', 'ar-ly', 'ar-ma', 'ar-sa', 'ar-tn', 'ar', 'az', 'be', 'bg', 'bn', 'bo', 'br', 'bs', 'ca', 'cs', 'cv', 'cy', 'da', 'de-at', 'de-ch', 'de', 'dv', 'el', 'en-au', 'en-ca', 'en-gb', 'en-ie', 'en-nz', 'eo', 'es-do', 'es', 'et', 'eu', 'fa', 'fi', 'fo', 'fr-ca', 'fr-ch', 'fr', 'fy', 'gd', 'gl', 'gom-latn', 'he', 'hi', 'hr', 'hu', 'hy-am', 'id', 'is', 'it', 'ja', 'jv', 'ka', 'kk', 'km', 'kn', 'ko', 'ky', 'lb', 'lo', 'lt', 'lv', 'me', 'mi', 'mk', 'ml', 'mr', 'ms-my', 'ms', 'my', 'nb', 'ne', 'nl-be', 'nl', 'nn', 'pa-in', 'pl', 'pt-br', 'pt', 'ro', 'ru', 'sd', 'se', 'si', 'sk', 'sl', 'sq', 'sr-cyrl', 'sr', 'ss', 'sv', 'sw', 'ta', 'te', 'tet', 'th', 'tl-ph', 'tlh', 'tr', 'tzl', 'tzm-latn', 'tzm', 'uk', 'ur', 'uz-latn', 'uz', 'vi', 'x-pseudo', 'yo', 'zh-cn', 'zh-hk', 'zh-tw'].forEach(localeName => {
  console.log(
    localeName + ':',
    getMonthYear(localeName));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script>

您可以找到类似的问题herehere

以下脚本创建并显示一个Map,其中包含每个LL字符串的出现次数。正如您所看到的,D MMMM YYYY出现了68次(由前一个代码段的正则表达式定位)以及之前 getMonthYear 所涵盖的其他格式。这可以帮助您定义不支持的案例列表并定义自定义解决方法

let formatMap = new Map();

['af' , 'ar-dz', 'ar-kw', 'ar-ly', 'ar-ma', 'ar-sa', 'ar-tn', 'ar', 'az', 'be', 'bg', 'bn', 'bo', 'br', 'bs', 'ca', 'cs', 'cv', 'cy', 'da', 'de-at', 'de-ch', 'de', 'dv', 'el', 'en-au', 'en-ca', 'en-gb', 'en-ie', 'en-nz', 'eo', 'es-do', 'es', 'et', 'eu', 'fa', 'fi', 'fo', 'fr-ca', 'fr-ch', 'fr', 'fy', 'gd', 'gl', 'gom-latn', 'he', 'hi', 'hr', 'hu', 'hy-am', 'id', 'is', 'it', 'ja', 'jv', 'ka', 'kk', 'km', 'kn', 'ko', 'ky', 'lb', 'lo', 'lt', 'lv', 'me', 'mi', 'mk', 'ml', 'mr', 'ms-my', 'ms', 'my', 'nb', 'ne', 'nl-be', 'nl', 'nn', 'pa-in', 'pl', 'pt-br', 'pt', 'ro', 'ru', 'sd', 'se', 'si', 'sk', 'sl', 'sq', 'sr-cyrl', 'sr', 'ss', 'sv', 'sw', 'ta', 'te', 'tet', 'th', 'tl-ph', 'tlh', 'tr', 'tzl', 'tzm-latn', 'tzm', 'uk', 'ur', 'uz-latn', 'uz', 'vi', 'x-pseudo', 'yo', 'zh-cn', 'zh-hk', 'zh-tw'].forEach(localeName => {
  var format =  moment.localeData(localeName).longDateFormat('LL');
  
  if( formatMap.has(format) ){
    let val = formatMap.get(format);
    formatMap.set(format, val+1);
  } else {
    formatMap.set(format, 1);
  }
  
});

console.log(formatMap);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script>