Moment.js 格式化 "Date(2021,0,1)"

Moment.js formatting "Date(2021,0,1)"

我正在使用 moment.js 并需要帮助转换以下字符串:

let dtString = "Date(2021,0,1)";
let dt = moment(dtString, 'YYYY,M,D').format('l');

"Date(2021,0,1)" 有一个从零开始的月份。上面的代码 returns 无效日期。

当我尝试 "Date(2021,1,1)"dt returns 1/1/2021.

我怎样才能意识到 M 值是从零开始的月份,而 return "Date(2021,0,1)" 是 2021 年 1 月 1 日?

更新:
这是我刚试过的其他东西...再次它很笨重但有效。

let dtString = "Date(2021,0,1)";
let dtArray = dtString.replace("Date(", "").replace(")", "").split(",").map(Number);
let jsDate = new Date(dtArray[0], dtArray[1], dtArray[2]);
let dt = moment(jsDate).format('l');
console.log(dt);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

更新 2:
结合@kometen 和@eskew 我发现这也有效。谢谢你们!

let dtString = "Date(2021,0,1)";
let dtArray = dtString.replace("Date(", "").replace(")", "").split(",").map(Number);
let dt = moment(dtArray).format('l');
console.log(dt);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

看起来 moment().month() 确实 accept 基于 0 的月份编号,所以如果您将其更改为 moment([2012, 0, 31]) 它应该可以工作。

一个稍微笨拙的方法是将 dtString 解析成它的部分,然后在 moment() constructor's parameter in an array structure 中重新组合它们,这将告诉 momentjs 以与原生 Date API 将(包括零索引月份值等):

let dtString = "Date(2021,0,1)";
let dtStringFormat = /Date\((?<Year>\d{4}),(?<Month>\d{1,2}),(?<Day>\d{1,2})\)/g;
let groups = dtStringFormat.exec(dtString).groups;
let dt = moment(Object.values(groups));
console.dir(dt);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous"></script>

免责声明。我既不推荐也不赞成使用 eval,因为它可能会被滥用。

话虽如此,如果您可以相信日期字符串不会包含任何危险的东西,那么您就可以像这样使用它。无需解析。

let dtString = "Date(2021,0,1)";
let date = eval('new ' + dtString);
let dt = moment(date).format('l');

document.getElementById('date').innerText = dt;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
<div id="date"></div>