Javascript 输入一个 UTC 字符串



我现在正在做一个项目,我想在两个端点之间获取一个日期数组。当我硬编码开始和结束日期时,我已经让该代码完美运行。

我的问题是当我使用输入时,代码不起作用。如何将普通日期输入转换为 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()函数。

相关内容

最新更新