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

Jes*_*erA 6 javascript date momentjs

背景

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

问题

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

请考虑以下片段:

new Date(2016, 0, 1).toLocaleDateString('ar');
>>"??/??/????"
Run Code Online (Sandbox Code Playgroud)

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

以下将不起作用:

new Date(new Date(2016, 0, 1).toLocaleDateString('ar'));
>>Invalid Date
Run Code Online (Sandbox Code Playgroud)

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

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

moment().format('L');
>>"??/??/????"

moment(new moment().format('L'))._d;
>>Invalid Date
Run Code Online (Sandbox Code Playgroud)

或者有没有其他/更好的方式来思考这样的问题?

Mag*_*int 2

由于 JS Date 的工作方式,确实没有什么好方法可以仅使用 Date 对象来完成此操作。它没有一致的解析行为。

\n\n

时刻会为你做到这一点,而且你实际上已经非常接近了。我不确定您为什么要立即调用新关键字。那是没有必要的。要使用 Moment 获取阿拉伯语日期:

\n\n
moment.locale(\'ar-sa\'); \nmoment().format(\'L\')\n"\xd9\xa1\xd9\xa5/\xd9\xa0\xd9\xa6/\xd9\xa2\xd9\xa0\xd9\xa1\xd9\xa6"\n
Run Code Online (Sandbox Code Playgroud)\n\n

将该日期解析回某个时刻:

\n\n
moment("\xd9\xa1\xd9\xa5/\xd9\xa0\xd9\xa6/\xd9\xa2\xd9\xa0\xd9\xa1\xd9\xa6", \'L\').format()\n"\xd9\xa2\xd9\xa0\xd9\xa1\xd9\xa6-\xd9\xa0\xd9\xa6-\xd9\xa1\xd9\xa5T\xd9\xa0\xd9\xa0:\xd9\xa0\xd9\xa0:\xd9\xa0\xd9\xa0-\xd9\xa0\xd9\xa5:\xd9\xa0\xd9\xa0"\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,如果您需要英文字符来与 API 交互:

\n\n
moment("\xd9\xa1\xd9\xa5/\xd9\xa0\xd9\xa6/\xd9\xa2\xd9\xa0\xd9\xa1\xd9\xa6", \'L\').locale(\'en\').format()\n"2016-06-15T00:00:00-05:00"\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
    LT : \'HH:mm\',\n    LTS : \'HH:mm:ss\',\n    L : \'DD/MM/YYYY\',\n    LL : \'D MMMM YYYY\',\n    LLL : \'D MMMM YYYY HH:mm\',\n    LLLL : \'dddd D MMMM YYYY HH:mm\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,无论您使用什么格式作为 moment 的第二个参数,都将是 moment 正在寻找的格式。不同的区域设置有不同的格式,因此在区域设置之间进行更改时需要小心。

\n\n

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

\n\n
moment("\xd9\xa1\xd9\xa5/\xd9\xa0\xd9\xa6/\xd9\xa2\xd9\xa0\xd9\xa1\xd9\xa6", \'L\').toDate()\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n