我正在使用 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>
答案 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>