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