Moment.js 格式化“日期(2021,0,1)”

时间:2021-02-24 14:41:42

标签: javascript momentjs

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

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

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

当我尝试 "Date(2021,1,1)" 时,dt 返回 1/1/2021。

我怎样才能有时间识别 M 值是从零开始的月份并将 "Date(2021,0,1)" 返回为 1/1/2021?

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

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>

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

Date
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);

答案 2 :(得分:0)

免责声明。我既不推荐也不赞同使用 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>