我现在正在研究一个项目,我想在这两个端点之间获得一系列日期。硬编码开始日期和结束日期时,我的代码可以正常工作。
我的问题是,当我使用输入时,代码不起作用。如何将正常日期输入转换为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);
}
我希望将“ water”变量的格式设置为类似于“ fire”变量。
我看到有.toUTCstring(),但这不起作用
答案 0 :(得分:0)
这可能是Why does Date.parse give incorrect results的副本,但这是一个更合适的答案。
日期输入的值是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())">
答案 1 :(得分:-1)
我强烈建议使用出色的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()
function和moment.format()
function。