Javascript输入UTC字符串

时间:2018-06-20 22:09:55

标签: javascript date 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);
   }

我希望将“ water”变量的格式设置为类似于“ fire”变量。

我看到有.toUTCstring(),但这不起作用

2 个答案:

答案 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() functionmoment.format() function