【问题标题】:Native method to inverse Date.toLocaleString convertion in JavaScript?在 JavaScript 中反转 Date.toLocaleString 转换的本机方法?
【发布时间】:2018-05-20 08:28:16
【问题描述】:

我们已将日期转换为locale string。例如:

x = (new Date()).toLocaleString()

x 有值

"20.05.2018, 10:21:37"

如何将此字符串处理为Date对象。

我试过了

new Date(x)
Invalid Date

Date.parse(x)
NaN

如果没有像moment.js这样的外部库,这可能而且简单吗?

【问题讨论】:

标签: javascript date locale date-parsing


【解决方案1】:

你可以自己解析。

const date = "20.05.2018, 10:21:37";
const [first, second] = date.split(',').map(item => item.trim());
const [day, month, year] = first.split('.');
const [hours, minutes, seconds] = second.split(':');

const newDate = new Date(year, month - 1, day, hours, minutes, seconds);
console.log(newDate);

或者使用正则表达式

const date = "20.05.2018, 10:21:37";
const m = /^(\d{2})\.(\d{2})\.(\d{4}), (\d{2}):(\d{2}):(\d{2})$/.exec(date);
const newDate = new Date(m[3], m[2] - 1, m[1], m[4], m[5], m[6]);
console.log(newDate);

【讨论】:

  • 可以使用dateString.split(/\D+/) 简化拆分以一次性获取所有数值,因此let [d,m,y,h,M,s] = "20.05.2018, 10:21:37".split(/\D+/); new Date(y,m-1,d,h,M,s)。 ;-)
【解决方案2】:

可以在事先不知道的情况下使用Intl.DateTimeFormat.prototype.formatToParts()获取日期的格式。

// should default to toLocaleDateString() format
var formatter = Intl.DateTimeFormat()
// I suggest formatting the timestamp used in
// Go date formatting functions to be able to 
// extract the full scope of format rules
var dateFormat = formatter.formatToParts(new Date(1136239445999))

在我的机器上dateFormat 产量

[
    {type: "month", value: "1"},
    {type: "literal", value: "/"},
    {type: "day", value: "3"},
    {type: "literal", value: "/"},
    {type: "year", value: "2006"},
]

通过迭代这个数组,将一个字符串解析成多个部分,然后将它们填充到Date 对象中应该是可行的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 2019-12-04
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2017-07-23
    • 2018-08-23
    相关资源
    最近更新 更多