首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中,获取给定月份中的所有周末日期

在Java中,获取给定月份中的所有周末日期
EN

Stack Overflow用户
提问于 2010-07-18 01:05:44
回答 4查看 19.3K关注 0票数 13

我需要查找给定月份和给定年份的所有周末日期。

例如:对于01(月),2010(年),输出应为: 2,3,9,10,16,17,23,24,30,31,所有周末日期。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-18 01:24:17

这是一个粗略的版本,带有描述步骤的注释:

代码语言:javascript
复制
// 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
票数 21
EN

Stack Overflow用户

发布于 2015-06-15 21:03:22

java.time

您可以使用Java 8 streamjava.time package。这里生成了一个从1到给定月份天数的IntStream。此流被映射到给定月份的LocalDate流,然后进行过滤以保留周六和周日的流。

代码语言:javascript
复制
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)。

票数 14
EN

Stack Overflow用户

发布于 2016-10-08 04:34:57

Answer by Lokni看起来是正确的,在使用Streams时也有加分。

EnumSet

我的改进建议是:EnumSet。这个类是Set的一个非常高效的实现。它们在内部表示为位向量,执行速度快,占用的内存很少。

使用EnumSet,您可以通过传入一个Set<DayOfWeek>soft-code周末的定义。

代码语言:javascript
复制
Set<DayOfWeek> dows = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );

使用没有流的老式语法的演示。您可以以类似的方式调整Lokni’s answer’s code以使用EnumSet

代码语言:javascript
复制
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

框架内置于Java8和更高版本中。这些类取代了麻烦的旧legacy日期时间类,如java.util.DateCalendarSimpleDateFormat

现在在maintenance mode中的项目建议迁移到java.time类。

要了解更多信息,请参阅。和搜索堆栈溢出,以获得许多示例和解释。规范为JSR 310

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC driver。不需要字符串,也不需要java.sql.*类。

从哪里获取java.time类?

  • ,、、和更高版本-标准Java API的一部分,具有捆绑的实现。
    • Java9添加了一些次要功能和fixes.

  • 和.

中的

  • 大多数java.time功能已向后移植到Java6和7

    • 更高版本的Android捆绑实现的java.time类。
    • 对于较早的Android (<26),项目适配 (如上所述)。请参阅.

项目使用额外的类扩展了java.time。这个项目是未来可能添加到java.time中的试验场。您可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3272454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档