Javascript 输入一个 UTC 字符串

Javascript input a UTC string

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

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

我强烈建议使用优秀的 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 and the moment.format() function

这可能与 Why does Date.parse give incorrect results 重复,但这里的答案可能更合适。

日期输入的值是 "YYYY-MM-DD" 格式的 ISO 8601 格式日期字符串,您应该从中看到:

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())">