根据当地情况显示日期和月份,没有一年

时间:2017-02-24 11:15:44

标签: javascript date localization formatting momentjs

是否有更好的方法可以从包含位置适当分隔符的日期获得日期和月份?

我有一个首先获得分隔符的解决方案:

 function getDateSep() {
   var temp = moment().format('L');
   var locale = moment().locale;
   var datesep = temp.substring(5, 6);
   return datesep;
}

然后像这样构建日期:

var sep = function getDateSep()
var date = date.format('D' + sep + 'M'+ sep)

是否有动态构建整个日期的解决方案?

我想要达到的结果如下: 31.01(dd.mm) 31/01(年/月) 01.31(mm.dd) 01/31(mm / dd)等

4 个答案:

答案 0 :(得分:4)

如链接问题中所述:您需要的一种方法是获取本地化的longDateFormat,然后使用正则表达式删除年份部分。

Daniel T.在评论中强调该解决方案不适用于en-CA这样的区域设置,因此我将提供一个更新的解决方案,其中包含某些其他启动的区域设置年份。

可能还有其他一些区域设置没有/.YYYY//YYYY./ RegExp,如果您需要支持每个区域设置,您可以使用广告定位它们正如我在以下代码段中对ar-ly所做的那样条件。

这里的代码示例显示了各种语言环境中的可能输出:

function changeLang(value){
  moment.locale(value);
  
  // Get locale data
  var localeData = moment.localeData();
  var format = localeData.longDateFormat('L');
  
  // Manage custom cases
  if( value === "ar-ly"){
    format = 'D/\u200FM';
  }
  // if( value === ...) possible othter cases
  
  // Check locale format and strip year
  if( format.match(/.YYYY/g) ){
    format = format.replace(/.YYYY/, '');
  }
  if( format.match(/YYYY./g) ){
    format = format.replace(/YYYY./, '');
  }

  var res = moment().format(format);
  
  $("#result").html(res);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

<select onchange="changeLang(value)">
  <option value="en">EN</option>
  <option value="en-CA">en-CA (Canada)</option>
  <option value="eo">eo (Esperanto)</option>
  <option value="de">DE</option>
  <option value="it">IT</option>
  <option value="hu">hu (Hungarian)</option>
  <option value="ja">ja (Japanese)</option>
  <option value="lv">lv (Latvian)</option>
  <option value="fr">FR</option>
  <option value="zh-hk">zh-hk - Chinese (Hong Kong)</option>
  <option value="ar-ly">ar-ly - Arabic (Lybia)</option>
</select>

<div id="result"></div>

答案 1 :(得分:3)

您可以尝试以下正则表达式,并检查它是否适合您。我尝试了其他区域设置,使其正常运行

dateFormat.replace(/Y/ig, '  ').replace(/^\W{1,}|\W{1,}$|\W{3,3}/, '');

答案 2 :(得分:2)

您是否考虑过使用Date#toLocaleDateString代替monentjs

需要输出JS Date对象和选项 您指定格式的区域设置日期。

示例:

var date = new Date();
var options = { day: 'numeric', month: 'short' };

console.log(date.toLocaleDateString('en-GB', options));
// outputs: Feb 24

var numeric = { day: 'numeric', month: 'numeric' };

console.log(date.toLocaleDateString('en-GB', numeric));
// outputs: 24/02

答案 3 :(得分:0)

虽然接受的答案通过操纵Moment提供的预定义本地化格式来完成工作,但Moment还有另一种方式允许您扩展其本地化配置,这在某些情况下可能更适用。

如果您在npm模块中打开一个本地化文件,例如/moment/locale/de.js, 您将看到如下所示的本地化日期格式列表:

longDateFormat : {
    LT: 'HH:mm',
    LTS: 'HH:mm:ss',
    L : 'DD.MM.YYYY',
    LL : 'D. MMMM YYYY',
    LLL : 'D. MMMM YYYY HH:mm',
    LLLL : 'dddd, D. MMMM YYYY HH:mm'
},

这将为您提供一个很好的起点,并为如何为所支持的每个语言环境进行本地化提供了线索。例如,德语将日期放在月份的前面,而英语则将月份放在日期之前。

然后,您可以通过在初始化时扩展配置来复制和调整所需的格式:

// Update configs with custom date formats per language after
// moment locales are loaded (LMD is a custom format here)
moment.updateLocale('en', { longDateFormat: { LMD: 'MMMM D' } });
moment.updateLocale('de', { longDateFormat: { LMD: 'D. MMMM' } });
// repeat with culturally-correct formatting for other locales you support

function changeLang(value){
  moment.locale(value);
  
  // Retrieve stored custom format
  var format = moment.localeData().longDateFormat('LMD');
  var res = moment().format(format);
  
  $("#result").html(res);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

<select onchange="changeLang(value)">
  <option value="en">EN</option>
  <option value="de">DE</option>
</select>

<div id="result"></div>

您也可以放弃扩展配置,并将自定义格式保留在自定义数据结构中,如下所示:

var MOMENT_FORMATS = {
  LMD: {
    en: 'MMMM D',
    de: 'D. MMMM'
  }
};
moment().format(MOMENT_FORMATS.LMD[moment.locale()])