获得一个月的第一个星期一

我想得到特定月份/年的第一个星期一的日子。

是)我有的:

我基本上有两个int变量,一个代表年份,一个代表月份。

我想要的是:

我想知道本月的第一个星期一,最好是int或Integer值。

例如:

我有2014年和1月(1月),这个月的第一个星期一是第6个,所以我想返回6个。

问题:

我以为我可以用Calendar做到这一点,但我已经无法设置只有年份和月份的日历。 此外,我不知道如何使用Calendar实际返回月/月的第一个星期一。

我已经尝试过了:

 Calendar cal = Calendar.getInstance(); cal.set(this.getYear(),getMonth(), 1); int montag = cal.getFirstDayOfWeek(); for( int j = 0; j < 7; j++ ) { int calc = j - montag; if( calc < 0 ) { calc += 6; } weekDays[calc].setText(getDayString(calc)); } 

getFirstDayOfWeek()返回哪一天用作当前语言环境的开头。 有些人认为周一的第一天,周日的其他人等。

这看起来你只需将其设置为DAY_OF_WEEK = MONDAYDAY_OF_WEEK_IN_MONTH = 1因为它将为您提供该月的第一个星期一。 要对年份执行相同操作,请先将MONTH值设置为JANUARY然后重复上述操作。

例:

 private static Calendar cacheCalendar; public static int getFirstMonday(int year, int month) { cacheCalendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); cacheCalendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1); cacheCalendar.set(Calendar.MONTH, month); cacheCalendar.set(Calendar.YEAR, year); return cacheCalendar.get(Calendar.DATE); } public static int getFirstMonday(int year) { return getFirstMonday(year, Calendar.JANUARY); } 

这是一个测试它的简单JUnit: http : //pastebin.com/YpFUkjQG

Java.time

使用Java 8和TemporalAdjuster中内置的java.time库。 请参阅教程 。

 import java.time.DayOfWeek; import java.time.LocalDate; import static java.time.temporal.TemporalAdjusters.firstInMonth; LocalDate now = LocalDate.now(); //2015-11-23 LocalDate firstMonday = now.with(firstInMonth(DayOfWeek.MONDAY)); //2015-11-02 (Monday) 

如果您需要添加时间信息,可以使用任何可用的LocalDateLocalDateTime转换

 firstMonday.atStartOfDay() # 2015-11-02T00:00 

首先你应该知道最新版本的java即JAVA8JAVA8中熟悉LocalDate

然后只通过下面的代码

 public class Test { public static void main(String[] args) { LocalDate date=LocalDate.of(2014,1, 1); for(int i=0;i 

乔达时间

Joda-Time库提供了一个类LocalDate ,当您只需要一个没有时间的日期时。 getDayOfWeek方法返回一个可以与常量MONDAY进行比较的数字。

 LocalDate localDate = new LocalDate( year, month, 1 ); while ( localDate.getDayOfWeek() != DateTimeConstants.MONDAY ) { localDate = localDate.plusDays( 1 ); } int firstMonday = localDate.getDayOfMonth(); 

不可变的语法

对于线程安全,Joda-Time使用不可变对象 。 因此,我们不是修改现有对象中的字段值,而是根据原始对象创建新实例。

java.time

正如Abhishek Mishra所说的另一个答案,与Java 8捆绑在一起的新java.time包也提供了类似于Joda-Time的LocalDate类。

方法getFirstDayOfWeek()没有帮助。 引用它的javadoc:

得到一周的第一天是什么; 例如,美国的星期日,法国的星期一

以下测试方法使用模数运算来查找第一个星期一的月份日期:

 public static long getMondaysDay(int year, int month) { try { Date d = new SimpleDateFormat("dM-yyyy").parse("1-" + month + "-" + year); long epochMillis = d.getTime() + TimeZone.getDefault().getOffset(d.getTime()); return (12 - TimeUnit.MILLISECONDS.toDays(epochMillis) % 7) % 7; } catch (ParseException ignore) { return 0; } // Never going to happen } 

知道这个时代的第一天是星期四,这可以通过使用模数算法来计算纪元周的日期,然后到下一个星期一的天数,然后再次模数,以防第一天在星期四之前下降。 幻数124 (从星期四到星期一的天数)加1因为月份的天数从17开始,以确保减法后的正数结果。

Lamma Date库非常适合这个用例。

 @Test public void test() { assertEquals(new Date(2014, 1, 6), firstMonday(2014, 1)); assertEquals(new Date(2014, 2, 3), firstMonday(2014, 2)); assertEquals(new Date(2014, 3, 3), firstMonday(2014, 3)); assertEquals(new Date(2014, 4, 7), firstMonday(2014, 4)); assertEquals(new Date(2014, 5, 5), firstMonday(2014, 5)); assertEquals(new Date(2014, 6, 2), firstMonday(2014, 6)); } public Date firstMonday(int year, int month) { Date firstDayOfMonth = new Date(year, month, 1); return firstDayOfMonth.nextOrSame(DayOfWeek.MONDAY); } 
  Calendar calendar = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("MMM/dd/YYYY"); calendar.set(Calendar.MONTH,Calendar.JUNE); calendar.set(Calendar.DAY_OF_MONTH,1); int day = (Calendar.TUESDAY-calendar.get(Calendar.DAY_OF_WEEK)); if(day<0){ calendar.add(Calendar.DATE,7+(day)); }else{ calendar.add(Calendar.DATE,day); } System.out.println("First date is "+sdf.format(calendar.getTime())); 

最简单的方法是:

 LocalDate firstSundayOfNextMonth = LocalDate .now() .with(firstDayOfNextMonth()) .with(nextOrSame(DayOfWeek.MONDAY));