将字符串日期隐藏为没有时区的ISO格式

时间:2018-03-26 07:48:27

标签: javascript

我的输入日期格式类似于1 April 2018。我需要将其转换为2018-04-01格式。我正在使用以下代码:

var dateinput = new Date('2 April 2018').toISOString();
alert(dateinput);

我得到的重点是:

2015-04-01 T18:30:00.000Z

比我输入的少1天。另外如何从日期函数中删除部分T18:30:00.000Z

2 个答案:

答案 0 :(得分:1)

您遇到的问题是由于在构建新的Date.parse()实例时在幕后使用Date。这是实际上不推荐的内容,如MDN page for Date

中所述
  

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

如果你的输入格式足够简单(即总是以天为单位,然后是月份,然后是年份,有效值),最好的办法是创建一个解析输入字符串并构建Date的函数。使用Date.UTC()setUTC*()函数的对象。并编写另一个函数,该函数使用Date对象并使用getUTC*()方法构建目标格式的字符串。这样你就可以确定你的日期不会被关闭,也不会被时区所困扰。

如果您的用例实际上比这更复杂(多种输入和输出格式),那么最好使用像moment.js这样的库。

答案 1 :(得分:0)

function formatDate(date) {
// Get timezone offset in ms
var offset = (new Date()).getTimezoneOffset() * 60000;

// Get iso time and slice timezone
var dateWithoutTimeZone = (new Date(new Date(date) - offset)).toISOString().slice(0,-1);

var d = new Date(dateWithoutTimeZone);

var year = d.getFullYear();
var month = d.getMonth() + 1;
var day = d.getDate();

return `${year}-${(month > 9 ? '' : '0') + month}-${(day > 9 ? '' : '0') + day}`;
} 

formatDate('2 April 2018') // -> "2018-04-02"