从输入类型=“日期”到新日期的日期是不正确的日期输出

时间:2019-09-27 17:48:09

标签: javascript html

我有一个input="date",我正尝试分别拉开日期,月份和年份,似乎要过一天左右。例如,如果我输入1900年1月1日,它似乎会吐出来1899 1131。所以对于一个基本示例,我有-

function clickDate() {
  const dateinput = document.querySelector(".date").value;
  const dateObj = new Date(dateinput);
 
  console.log("pull date", dateObj.getFullYear(), dateObj.getMonth(), dateObj.getDate());
};
<input class="date" type="date">

<button onClick="clickDate()"> format</button>

您可以看到是否输入01/01/1900,控制台会输出“ pull date” 1899 11 31”。不确定我在这里忽略了什么。

1 个答案:

答案 0 :(得分:2)

您的问题在于UTC与本地时区的偏移量。

使用内置的解析器,格式为YYYY-MM-DD的字符串将解释为UTC,而其他字符串将被解释为本地。

不建议使用内置解析器:

  

注意:由于浏览器的差异和不一致,强烈建议不要使用Date构造函数(和Date.parse(),以相同的方式工作)来解析日期字符串。仅按照约定,对RFC 2822格式字符串的支持。支持ISO 8601格式的不同之处在于,仅日期字符串(例如“ 1970-01-01”)被视为UTC,而不是本地。 (mdn

另一方面,getFullYeargetMonthgetDate等返回本地值。

这是一个示范:

  const dateInput = '2019-02-05'
  const dateObj = new Date(dateInput); // parsed as UTC
  console.log("pull date", dateObj.getUTCFullYear(), dateObj.getUTCMonth(), dateObj.getUTCDate()); // UTC
  console.log("pull date", dateObj.getFullYear(), dateObj.getMonth(), dateObj.getDate()); // local

您有两种选择:

1)最简单的方法就是坚持使用getUTC...函数。

2)如果由于需要返回日期对象或对其进行操作而不起作用,则解析输入值并使用单独的年,月,日构造Date。之所以有效,是因为使用此构造函数时,输入被解释为本地输入。

const dateInput = '2019-02-05';
let dateParts = dateInput.split('-');
dateParts[1]--; // month in Date constructor is 0-indexed (e.g. '02' represents March);
const dateObj = new Date(...dateParts); // parsed as local
console.log("pull date", dateObj.getUTCFullYear(), dateObj.getUTCMonth(), dateObj.getUTCDate()); // UTC
console.log("pull date", dateObj.getFullYear(), dateObj.getMonth(), dateObj.getDate()); // local