我现在正在做一个项目,我想在两个端点之间获取一个日期数组。当我硬编码开始和结束日期时,我已经让该代码完美运行。
我的问题是当我使用输入时,代码不起作用。如何将普通日期输入转换为 UTC 字符串?
以下是我正在讨论的一个例子:https://jsfiddle.net/mksvh95y/5/
<input type="date" id="bubbles" placeholder = "enter date">
<button onclick="getDate()"> Click me to get date</button>
<script>
function getDate(){
var water = document.getElementById("bubbles").value;
alert(water);
//alert(water.toUTCString());
var fire = new Date (2018,10,15);
alert(fire);
}
我希望获取"水"变量的格式类似于"火"变量。
我看到有.toUTCstring((,但这不起作用
这可能是为什么 Date.parse 给出不正确的结果的副本,但这里有一个可能更合适的答案。
日期输入的值是 ISO 8601 格式的日期字符串,格式为"YYYY-MM-DD",您应该从中看到:
alert(water); // something like 2018-06-21
Date.prototype.toString返回的字符串格式依赖于实现(尽管 ECMAScript 2019 将对其进行标准化(。这就是您获得的格式:
alert(fire) // e.g. Thu Jun 21 2018 00:00:00 GMT+1000 (AEST)
一种解决方法是将字符串从日期输入转换为日期,然后对两个输出使用默认的toString。但是您的问题是解析 ISO 8601 日期字符串是 UTC,因此日期会因主机时区偏移量而异,例如
console.log(new Date('2018-06-21').toString()); // 21 Jun 2018
console.log(new Date(2018, 5, 21).toString()); // 21 Jun 2018
因此,您需要使用一个简单的函数将输入中的字符串解析为本地字符串,如下所示:
function parseISOLocal(s) {
var b = s.split(/D/);
return new Date(b[0],b[1]-1,b[2]);
}
console.log(parseISOLocal('2018-06-21').toString());
console.log(new Date(2018, 5, 21).toString());
如果你想使用像moment.js这样的库,它会将ISO 8601格式的日期字符串解析为本地的(这与ISO 8601一致(,然后将其转换为纯日期并使用默认的toString,例如
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<input type="date"
onchange="console.log(moment(this.value).toDate().toString())">
我强烈建议使用优秀的 MomentJS 库进行日期维护,因为本机支持很差:
function getDate(){
var water = document.getElementById("bubbles").value;
var waterMoment = moment(water);
alert(water.utc().format()); //outputs a UTC date string
var fire = new Date (2018,10,15);
alert(fire);
}
有关更多详细信息,请参阅moment.utc()
函数和moment.format()
函数。