我有一个<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
答案 0 :(得分:1)
您可以使用moment(String, String[])
来解析不同格式的输入:
如果您不知道输入字符串的确切格式,但是知道它可能是多种格式之一,则可以使用一系列格式。
您可以使用moment.ISO_8601
,如here来解析ISO 8601输入,就像moment(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>