Javascript 如何仅获取月份最后一天在两个给定日期之间的星期一的日期
返回值应为类似“10/31/2016 8/31/2017”的字符串。这个函数返回一年中的所有星期一,但是如果它们是一个月的最后一天,我只需要每个月的最后一个星期一的日期Javascript 如何仅获取月份最后一天在两个给定日期之间的星期一的日期,javascript,date,Javascript,Date,返回值应为类似“10/31/2016 8/31/2017”的字符串。这个函数返回一年中的所有星期一,但是如果它们是一个月的最后一天,我只需要每个月的最后一个星期一的日期 function getMondays(startYear, endYear) { const startDate = new Date(startYear, 0, 2) const endDate = new Date(endYear, 11, 32) var i = startDate, month = i
function getMondays(startYear, endYear) {
const startDate = new Date(startYear, 0, 2)
const endDate = new Date(endYear, 11, 32)
var i = startDate,
month = i.getYear(),
mondaysOfYear = []
while (i.getDay() !== 2) {
i.setDate(i.getDate() + 1)
}
while (i.getYear() === month) {
mondaysOfYear.push(new Date(i.getTime()))
i.setDate(i.getDate() + 7)
}
return mondaysOfYear
}
getMondays(2017, 2017)
这会让你度过最后一个星期一-
function getMondays(startYear, endYear) {
const startDate = new Date(startYear, 0, 2)
const endDate = new Date(endYear, 11, 32)
var i = startDate,
month = i.getYear(),
mondaysOfYear = []
while (i.getDay() !== 2) {
i.setDate(i.getDate() + 1)
}
var prevMonth = 0;
var prevDate;
while (i.getYear() === month) {
if(i.getMonth()!= prevMonth) mondaysOfYear.push(prevDate);
prevMonth = i.getMonth(); //Retaining the last month to compare
prevDate = new Date(i.getTime()); //Retaining the last monday
i.setDate(i.getDate() + 7);
}
mondaysOfYear.push(prevDate);//for December
return mondaysOfYear
}
getMondays(2017, 2017);
过滤掉月份更改时的日期。在循环之后最后添加12月的最后一个星期一。类似的内容
--编辑
这里有一个链接,以防在stackoverflow上给出不正确的结果:)
函数getMondays(开始日期、结束日期){
风险值月数=[31,28,31,30,31,30,31,31,30,31,30,31];
var周一=[];
而(startYear
函数getMondays(开始日期、结束日期){
每年的星期一=[]
对于(var y=startYear;y而言,您的逻辑似乎不合适。存在:
month = i.getYear(),
getYear返回一个2位数的年份,将其分配给名为“month”的变量似乎不合理。然后:
while (i.getDay() !== 2) {
i.setDate(i.getDate() + 1)
}
将递增日期,直到getDay返回2,即星期二。然后:
if (i.getMonth() != prevMonth) mondaysOfYear.push(prevDate);
对我来说没有任何意义。我猜你的算法是将日期设置为星期一,然后再加上几周,如果它在一个月结束时结束,则保存它。但你没有以这种方式实现它
一个更简单且可能更快的算法是从开始到结束获取每个月的最后一天,如果是星期一,则将其推送到一个数组中
函数getMondays(开始日期、结束日期){
//将开始设置为开始年份的1月1日
var start=新日期(startYear,0);
//设定年底至年底12月31日
var结束=新日期(结束年,11,31);
var周一=[];
做{
//将日期设置为月底
start.setMonth(start.getMonth()+1,0);
//如果是星期一,请以美国mm/dd/yyyy格式存储
if(start.getDay()==1){
星期一。推送(开始)到本地{
年份:'数字',
月份:“2位”,
日期:“两位数”
}));
}
//将日期设置为下个月开始
start.setDate(start.getDate()+1);
}虽然(开始您的问题不清楚,但显然您希望找到一个月的最后一天恰好是星期一的所有事件
YearMonth ym = startYm;
while ( ym.isBefore( stopYm ) ) {
LocalDate endOfMonth = ym.atEndOfMonth();
if ( endOfMonth.getDayOfWeek().equals( dow ) ) {
lastMondays.add( endOfMonth ); // Collect our last-monday-of-this-month.
}
// Set up the next loop.
ym = ym.plusMonths( 1 );
}
java.time
现代方法使用java.time类。具体来说,该类表示一个只包含日期的值,不包含一天中的时间,也不包含时区。正如其名称所示,还有类和
为了类型安全,您可以传递Year
对象,而不仅仅是传递整数,从而使您的代码更加自我记录
Year startYear = Year.of( 2016 );
Year stopYear = Year.of( 2018 );
定义你的实用方法
public List< LocalDate > calcMondays ( Year startYear , Year stopYear ) { … }
定义我们找到的日期的集合
int initialCapacity = ( int ) ChronoUnit.MONTHS.between( startYear.atDay( 1 ) , stopYear.atDay( 1 ) );
List< LocalDate > lastMondays = new ArrayList<>( initialCapacity ) ;
使用TemporalAdjusters
类中的实现定义TemporalAdjusters
TemporalAdjuster ta = TemporalAdjusters.lastInMonth( dow ) ;
循环月份。对于每个月份,确定第一个星期一。使用类中的实现
报告
System.out.println( lastMondays ) ;
你看
[2016-01-252016-02-292016-03-282016-04-252016-05-302016-06-272016-07-252016-08-292016-09-262016-10-312016-11-282016-12-262017-01-302017-02-272017-03-272017-04-242017-05-292017-06-262017-07-312017-08-282017-09-252017-10-302017-11-272017-12-25]
现在让我们修改这个循环,只关注一个月的最后一天恰好是星期一的情况
YearMonth ym = startYm;
while ( ym.isBefore( stopYm ) ) {
LocalDate endOfMonth = ym.atEndOfMonth();
if ( endOfMonth.getDayOfWeek().equals( dow ) ) {
lastMondays.add( endOfMonth ); // Collect our last-monday-of-this-month.
}
// Set up the next loop.
ym = ym.plusMonths( 1 );
}
看这个
[2016-02-292016-10-312017-07-31]
请注意,这些结果与问题中给出的结果不同。我验证了这些结果是正确的,并且问题的结果是错误的
关于java.time
该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,如,&
该项目现已启动,建议迁移到类
要了解更多信息,请参阅.和搜索堆栈溢出以获取许多示例和解释。规范为
您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要java.sql.*
classes
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(在这个范围内迭代几个月,将日期设置为每月的第一天,返回一天
date.setDate(date.getDate()-1);
并检查date.getDate()==2
如果startYear是2017,如何获得2016年10月31日为什么endDate=新日期(endYear,11,32)
?那将是次年1月1日。仅供参考,非常麻烦的旧日期时间类,如和java.text.simpleDataFormat
,现在被java 8及更高版本中内置的类所取代。请参见。您的示例日期“10/31/2016 8/31/2017”不正确。2016年和2017年的月末是星期一的情况是:2016-02-292016-10-312017-07-31。请参见在线日历和.FYI,非常麻烦的旧日期时间类,如和java.text.SimpleDateFormat
,现在被java 8和更高版本中内置的类所取代。请参见。
YearMonth ym = startYm ;
while( ym.isBefore( stopYm ) ) {
LocalDate firstOfMonth = ym.atDay( 1 ) ;
LocalDate ld = firstOfMonth.with( ta ) ;
lastMondays.add( ld ) ; // Collect our last-monday-of-this-month.
// Set up the next loop.
ym = ym.plusMonths( 1 ) ;
}
System.out.println( lastMondays ) ;
YearMonth ym = startYm;
while ( ym.isBefore( stopYm ) ) {
LocalDate endOfMonth = ym.atEndOfMonth();
if ( endOfMonth.getDayOfWeek().equals( dow ) ) {
lastMondays.add( endOfMonth ); // Collect our last-monday-of-this-month.
}
// Set up the next loop.
ym = ym.plusMonths( 1 );
}