获取给定日期的最后一年日期

时间:2018-05-11 13:50:33

标签: javascript



var reportDateStr = "2018-05-21";
var reportDate = new Date(reportDateStr);
var y = reportDate.getFullYear();
var lastDateOfReportYear = new Date(reportDate.getFullYear(), 11, 31);

console.log(lastDateOfReportYear)




而不是2018年12月31日2018年的最后一天,我将于2019年1月31日到 请问,你能告诉我上面的代码有什么问题吗?为什么我要收到2019年1月31日?

3 个答案:

答案 0 :(得分:2)

老实说,如果不深入了解您正在使用的浏览器/节点版本(我们将在稍后讨论为什么会这么重要),我有点不确定为什么您要在一个月后获得约会(Jan 1,2019对于你遇到的问题会更有意义)但我会给出更高层次的解释,解释为什么2019年1月1日可能会发生。

来自Date文档:

  

注意:如果将Date作为具有多个参数的构造函数调用,则指定的参数表示本地时间。如果需要UTC,请使用具有相同参数的新日期(Date.UTC(...))。

因为您正在构建一个包含三个参数的新日期,所以日期代表您当地的时间。



const localDate = new Date(2018, 11, 31);
console.log({
  localDate // in EST this will be "2018-12-31T05:00:00.000Z"
});




注意时间是" 05" (对于EST)而不是" 00"。根据建议使用Date.UTC将使其成为" 00"不管当地时间。



const localDate = new Date(Date.UTC(2018, 11, 31));
console.log({
  localDate // This will always be "2018-12-31T00:00:00.000Z"
});




从日期字符串创建日期时需要注意的一些事项(不推荐):

  

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

因此,由于各种JavaScript实现,生成的日期可能会有所不同。查看此chart以获取有关此问题的参考信息。

另请注意,getFullYear使用当地时间来获取全年值。这也会影响您想要的输出。

因此,为了更加安全,您可以使用UTC进行所有计算:



const reportDateStr = '2018-05-21';
const reportDate = new Date(reportDateStr); // This could still be problematic
const y = reportDate.getUTCFullYear();
const lastDateOfReportYear = new Date(Date.UTC(y, 11, 31));
console.log(lastDateOfReportYear.toUTCString());




还有像moment.js这样的库可以帮助处理涉及时间和日期的众多问题。

答案 1 :(得分:0)

你在做某事的工作总是一样的。

12月总是31天,而今年的最后一个月总是在12月,所以为什么不把这一年都追加到12-31

示例:

var reportDateStr="2018-05-21";

console.log(reportDateStr.substr(0,4)+'-12-31')

现在,如果你想保留你的功能,请确保TimeZone在哪里。您的代码适用于东部时间

答案 2 :(得分:0)

请参阅下面的工作代码段,
我在您的代码和注释中添加了一些安慰,以简化:



var reportDateStr = "2018-05-21";
var reportDate = new Date(reportDateStr);
var y = reportDate.getFullYear();
var lastDateOfReportYear = new Date(y , 11, 31);

// For me the below returns the 30th December, 11pm
console.log('Date:', lastDateOfReportYear);

// … because I've got -120 as offset!
console.log('TimezoneOffset:', new Date().getTimezoneOffset());

// You need to use this one to get rid of the Timezones:
var lastDateOfReportYear_2 = new Date(Date.UTC(y , 11, 31));
console.log('Date UTC:', lastDateOfReportYear_2);




希望它有所帮助。