Javascript从已知语言环境的toLocaleDateString解析日期

时间:2016-06-15 10:33:37

标签: javascript date momentjs

背景

在我的应用程序中,我想根据用户的语言环境格式化日期。如果用户修改了日期,我希望能够将其解析回javascript Date对象。

问题

我想知道是否可以使用javascript从本地格式化的字符串中解析日期?

请考虑以下代码段:

new Date(2016, 0, 1).toLocaleDateString('ar');
>>"١‏/١‏/٢٠١٦"

如果我想将该字符串解析回有效日期,我该如何处理?

以下内容不起作用:

new Date(new Date(2016, 0, 1).toLocaleDateString('ar'));
>>Invalid Date

我还尝试使用momentjs,但无法在那里找到工作方式。

//change global locale
moment.locale('ar-sa');

moment().format('L');
>>"١٥/٠٦/٢٠١٦"

moment(new moment().format('L'))._d;
>>Invalid Date

还是有其他/更好的方法来思考这样的问题吗?

1 个答案:

答案 0 :(得分:1)

由于JS Date的工作方式,实际上没有一种好方法只使用Date对象。它没有一致的解析行为。

瞬间会为你做这件事,你实际上非常接近。我不确定你为什么要刻意调用新关键字。这不是必要的。用Moment获得阿拉伯语约会:

moment.locale('ar-sa'); 
moment().format('L')
"١٥/٠٦/٢٠١٦"

将该日期解析为片刻:

moment("١٥/٠٦/٢٠١٦", 'L').format()
"٢٠١٦-٠٦-١٥T٠٠:٠٠:٠٠-٠٥:٠٠"

或者如果您想要英文字符与API进行交互:

moment("١٥/٠٦/٢٠١٦", 'L').locale('en').format()
"2016-06-15T00:00:00-05:00"

请注意,当您使用'L'时,您会想到您正在专门寻找日期格式'DD / MM / YYYY'。作为参考,阿拉伯沙特阿拉伯的本地化日期格式如下:

    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'

因此,无论您使用哪种格式作为第二个参数,都将是寻找的格式。不同的语言环境具有不同的格式,因此在区域设置之间进行更改时需要小心。

如果您需要返回日期对象,可以执行以下操作:

moment("١٥/٠٦/٢٠١٦", 'L').toDate()

我必须警告你,这不是Moment.js中的最佳做法,除非你有第三方API需要消费日期。 Moment是一个完整的API(比JS Date更好),因此您需要编写的与日期和时间操作相关的任何代码都可以在当下生态系统中完成。