我需要查找给定月份和给定年份的所有周末日期。
例如:对于01(月),2010(年),输出应为:2,3,9,10,16,17,23,24,30,31,所有周末日期。
答案 0 :(得分:19)
这是一个粗略的版本,其中包含描述步骤的注释:
// create a Calendar for the 1st of the required month
int year = 2010;
int month = Calendar.JANUARY;
Calendar cal = new GregorianCalendar(year, month, 1);
do {
// get the day of the week for the current day
int day = cal.get(Calendar.DAY_OF_WEEK);
// check if it is a Saturday or Sunday
if (day == Calendar.SATURDAY || day == Calendar.SUNDAY) {
// print the day - but you could add them to a list or whatever
System.out.println(cal.get(Calendar.DAY_OF_MONTH));
}
// advance to the next day
cal.add(Calendar.DAY_OF_YEAR, 1);
} while (cal.get(Calendar.MONTH) == month);
// stop when we reach the start of the next month
答案 1 :(得分:11)
您可以使用Java 8 stream和java.time package。这里会生成从1
到给定月份天数的IntStream
。此流将在给定月份映射到LocalDate
的流,然后进行过滤以保留星期六和星期日。
import java.time.DayOfWeek;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.YearMonth;
import java.util.stream.IntStream;
class Stackoverflow{
public static void main(String args[]){
int year = 2010;
Month month = Month.JANUARY;
IntStream.rangeClosed(1,YearMonth.of(year, month).lengthOfMonth())
.mapToObj(day -> LocalDate.of(year, month, day))
.filter(date -> date.getDayOfWeek() == DayOfWeek.SATURDAY ||
date.getDayOfWeek() == DayOfWeek.SUNDAY)
.forEach(date -> System.out.print(date.getDayOfMonth() + " "));
}
}
我们找到与第一个答案相同的结果(2 3 9 10 16 17 23 24 30 31)。
答案 2 :(得分:2)
Answer by Lokni似乎是正确的,有使用Streams的奖励积分。
EnumSet
我的改进建议:EnumSet
。这个类是Set
的一个非常有效的实现。它们在内部表示为位向量,它们执行速度快,占用的内存很少。
使用EnumSet
,您可以通过Set<DayOfWeek>
传递soft-code周末的定义。
Set<DayOfWeek> dows = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );
使用没有Streams的老式语法进行演示。您可以调整Lokni’s answer’s code以类似的方式使用EnumSet
。
YearMonth ym = YearMonth.of( 2016 , Month.JANUARY ) ;
int initialCapacity = ( ( ym.lengthOfMonth() / 7 ) + 1 ) * dows.size() ; // Maximum possible weeks * number of days per week.
List<LocalDate> dates = new ArrayList<>( initialCapacity );
for (int dayOfMonth = 1; dayOfMonth <= ym.lengthOfMonth() ; dayOfMonth ++) {
LocalDate ld = ym.atDay( dayOfMonth ) ;
DayOfWeek dow = ld.getDayOfWeek() ;
if( dows.contains( dow ) ) {
// Is this date *is* one of the days we care about, collect it.
dates.add( ld );
}
}
TemporalAdjuster
您还可以使用TemporalAdjuster
接口,该接口提供操作日期时间值的类。 TemporalAdjusters
类(注意复数s
)提供了几个方便的实现。
ThreeTen-Extra项目提供了使用java.time的类。这包括TemporalAdjuster
实施,Temporals.nextWorkingDay()
。
您可以编写自己的实现来执行相反的操作nextWeekendDay
时间调整器。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 3 :(得分:1)
你可以尝试这样:
db.companies.find();
{ "_id" : 1, "name" : "ABC Pvt Ltd", "Address" : "Chennai, India" }
{ "_id" : 2, "name" : "XYZ Pvt Ltd", "Address" : "Mumbai, India" }