如何将用户输入格式化为正确的本地化格式?

时间:2018-12-14 14:39:00

标签: javascript date momentjs locale

我有一个<input type="text"/>,用户可以(尝试)以任何格式/语法(即使格式无效)键入日期。

我想获取用户键入的任何值,将其传递给本地化的时刻,然后以正确的格式更新输入。

我正在尝试关注these guidelines in order to use a local moment

// I want to use a local instance of moment
let localLocale = moment();

// I want to set the locale to be 'fr'
localLocale.locale('fr')

// I want to set the format to be 'LL'
localLocale.format('LL')

// this is what the user typed in
let userInput = '2/3/1986'

// I want to do:
let formattedUserInput = something(userInput)

formattedUserInput的值必须为Mars 2, 1986

我正在寻找something应该是什么。当文档如此混乱时,尚无关于如何执行此操作的说明。

如果userInput显然是胡言乱语,则something()应该返回null或抛出错误或其他无关紧要的内容。

我尝试了localLocale(userInput),但是它抛出了localLocale is not a function

2 个答案:

答案 0 :(得分:1)

您可以使用moment(String, String[])来解析不同格式的输入:

  

如果您不知道输入字符串的确切格式,但是知道它可能是多种格式之一,则可以使用一系列格式。

您可以使用moment.ISO_8601,如here来解析ISO 8601输入,就像moment(String)一样。

请注意,moment(String, String[])

  

从版本 2.3.0 开始,Moment使用一些简单的试探法来确定要使用的格式。顺序:

     
      
  • 首选格式会导致valid个日期超过无效日期。
  •   
  • 首选格式多于少的字符串,而格式多于少的字符串,即,更严格的解析。
  •   
  • 在数组中优先使用格式晚于格式。
  •   

以下是一种可能的解决方案:

function something(userInput){
  let m = moment(userInput, [moment.ISO_8601, 'DD/MM/YYYY', 'MM/DD/YYYY' ]);
  if( !m.isValid() ){
    // throw "Invalid input";
  }
  return m.locale('fr').format('LL');
}

['2/3/1986', 'aaa', '10-15-2017'].forEach((userInput) => {
  console.log( something(userInput) );
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/locale/fr.js"></script>

答案 1 :(得分:-1)

区域设置对于您定义的实例是本地的。所以

let localLocale = moment();
localLocale.locale('fr');

localLocale的本地设置为'fr'。因此,如果您只想在本地进行此输入,则可以使用:

// this is what the user typed in
let userInput = '2/3/1986';

// Use a local instance of moment, using the user's input
let localLocale = moment(userInput, 'D/M/YYYY');

// Set the locale to be 'fr'
localLocale.locale('fr');

// Get the formatted string
let formattedUserInput = localLocale.format('LL');

console.log(formattedUserInput);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment-with-locales.min.js" integrity="sha256-VrmtNHAdGzjNsUNtWYG55xxE9xDTz4gF63x/prKXKH0=" crossorigin="anonymous"></script>