2017-02-14 187 views
1

我对angular JS非常陌生,但是早晨因为这一点而挣扎。将月份的第一天转换为Angular JS中的月份的最后一天

我有一个“MM/yyyy”格式的日期选择器,这里返回的日期值是每月的第一天。 即2017年2月1日,但我希望日期为2017年2月28日,即月份的最后一天。

只是为了更新我正在使用矩功能。

请推荐一些解决方法!

回答

2

我从你的问题,你正在使用momentjs推断。

此lib中为您提供了一个内置的功能endof

const date = new Date(2017, 1) // 1st Feb  
moment(date).endOf('month'); 

这应该处理大多数情况下,包括直接leap years

2

如果你有一个JavaScript Date实例d,你可以简单地使用

const d = new Date(2017, 1) // 1st Feb 
 
d.setMonth(d.getMonth() + 1) 
 
d.setDate(d.getDate() - 1) 
 

 
console.info(d.toLocaleString())

现在d将是该月的最后一天。


注意:这可以轻松处理年边界而不需要任何额外的代码。例如

const d = new Date(2017, 11) // 1st Dec 
 
console.info('Before', d.toLocaleString()) 
 

 
d.setMonth(d.getMonth() + 1) 
 
d.setDate(d.getDate() - 1) 
 

 
console.info('After', d.toLocaleString())

+0

这是做一个很好的简便方法,但要记住,这样做你”取决于JavaScript引擎(因版本,浏览器和平台而异),可以按照您的预期进行转换,所以这将很容易出现错误。单单依赖你的代码来自己完成适当的转换总是比较好,而不是盲目地依赖外部的其他东西,比如JS引擎的实现。 – ablopez

+0

@ablopez你在谈论什么*“转换”*?如果您指的是年份边界问题(即将月份设置为“12”),则需要向我展示一个不起作用的示例。我不相信这里的行为在JS引擎之间完全不同。见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate#Description – Phil

+0

我从来没有说过它不会工作。我所说的是,依靠实现细节来修复你自己的代码中的逻辑缺陷是不好的做法,我的朋友。如果你在你编写的其他代码中做到这一点(与此无关),你只是遵循一种懒惰的编程模式,并且会增加整体代码中错误的可能性。 – ablopez

0

你只需要1个月添加到日期,然后。减去1天。这里有一个例子:

// Let's suppose the date selected from the picker was February 1st, 2017 
// Remember months in JS are zero-index based, so 0=Jan, 1=Feb, etc. 
var selectedDate = new Date(2017, 1, 1); 

var month = selectedDate.getMonth(); 
var year = selectedDate.getFullYear(); 

month ++; 

if(month > 11){ // Last month number is 11 (December) 
    month = 0; // January 
    year ++; 
} 

var oneMonthAheadDate = new Date(year, month, 1); 
var lastDayOfSelectedMonthDate = new Date(oneMonthAheadDate.getTime() - (1000 * 3600 * 24)); // We substract 1 day (1000 ms x 3600 secs in an hour x 24 hours in a day) 

你需要的日期将在lastDayOfSelectedMonthDate

相关问题