获得一个月的第一个星期一
我想得到特定月份/年的第一个星期一的日子。
是)我有的:
我基本上有两个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 = MONDAY
和DAY_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)
如果您需要添加时间信息,可以使用任何可用的LocalDate
到LocalDateTime
转换
firstMonday.atStartOfDay() # 2015-11-02T00:00
首先你应该知道最新版本的java即JAVA8在JAVA8中熟悉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 }
知道这个时代的第一天是星期四,这可以通过使用模数算法来计算纪元周的日期,然后到下一个星期一的天数,然后再次模数,以防第一天在星期四之前下降。 幻数12
是4
(从星期四到星期一的天数)加1
因为月份的天数从1
加7
开始,以确保减法后的正数结果。
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));