今年第二个星期一

时间:2016-10-13 03:32:27

标签: java

我需要在其中一个计划中计算当年的第二个星期一。 java中的一个方法,它使用格里高利历来告诉当前年度第二个星期一的日期是什么。请建议。

3 个答案:

答案 0 :(得分:1)

将日历设置为月份的第一天jan。

检索星期几

计算当月第一个星期一的日期。

使用calendar.add()方法添加7天。你将在第二个星期一到达。

答案 1 :(得分:1)

你可以写这样的东西

int year = 2016;
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.YEAR, year);
return cal.get(Calendar.DATE);

答案 2 :(得分:1)

TL;博士

java.util.GregorianCalendar.from( 
    LocalDate.now( ZoneId.of( "America/Montreal" ) ) 
             .with( TemporalAdjusters.firstDayOfYear() )
             .with( TemporalAdjusters.dayOfWeekInMonth( 2 , DayOfWeek.MONDAY ) )
             .atStartOfDay( ZoneId.of( "America/Montreal" ) )
)

避免遗留日期时间类

GregorianCalendar类现在已经遗留下来,取而代之的是java.time类,特别是ZonedDateTime。避免使用旧的旧日期时间类,因为它们设计不当,令人困惑且麻烦。

LocalDate

要获取仅限日期的值,请使用LocalDateLocalDate类表示没有时间且没有时区的仅限日期的值。

时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

TemporalAdjuster

TemporalAdjuster接口提供了操作日期时间值的类。 TemporalAdjusters(注释复数'')类提供了几个方便的实现。

我们是一个调整器,可以获得当年的第一天,另一个可以获得该月的第二个星期一。

LocalDate firstOfYear = today.with( TemporalAdjusters.firstDayOfYear() );
LocalDate secondMondayOfYear = firstOfYear.with( TemporalAdjuster.dayOfWeekInMonth( 2 , DayOfWeek.MONDAY ) );

GregorianCalendar

如果您真的需要GregorianCalendar,可以通过调用添加到旧类的新方法进行转换。我假设您希望将时间设置为当天的第一时刻。第一个时刻总是00:00:00所以让java.time确定那个时间。

ZonedDateTime zdt = secondMondayOfYear.atStartOfDay( z );
GregorianCalendar gc = java.util.GregorianCalendar.from( zdt );

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date.Calendar和& java.text.SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore