我的输入日期格式类似于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
?
答案 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"