我需要做一个方法,在下个月返回实际日期的位置。
for today (20/12/2016)
I need to call this method whit today date
The return given must to be (17/01/2016)
This method must return the third Tuesday of the next month
Is the 4 week of this month, but I need the Third Tuesday.
我尝试使用 Calendar.MONTH,Calendar.WEEK_OF_MONTH,Calendar.DAY_OF_WEEK ,但我无法获得第三个,我总是得到第四个。
有些事情是这样的:
public static Date getNextMonthDayOfWeel(Date d) {
Calendar c = Calendar.getInstance();
c.setTime(d);
int week = c.get(Calendar.WEEK_OF_MONTH);
int day = c.get(Calendar.DAY_OF_WEEK);
//// this block
if(!firstWeekOfMonthHad(day)){
week++;
}
//// this block
c.setFirstDayOfWeek(Calendar.SUNDAY);
c.add(Calendar.MONTH, 1);
c.set(Calendar.WEEK_OF_MONTH, week);
c.set(Calendar.DAY_OF_WEEK, day);
return c.getTime();
}
如果一个月的第一周有特定的一周,我该怎么办?
答案 0 :(得分:3)
如果您使用Java 8或更高版本,它就像:
一样简单LocalDate.now()
.plusMonths(1)
.with(TemporalAdjusters.firstInMonth(DayOfWeek.TUESDAY))
.plusWeeks(3);
答案 1 :(得分:1)
LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) // Get current date in this particular time zone.
.plusMonths( 1 ) // Move to equivalent date in the month after.
.with(
TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.TUESDAY ) // Move to the ordinal number occurrence of a day-of-week within this month.
)
你好像要问下个月的第三个星期二。
Answer by Mellgren很好,但是使用更合适的TemporalAdjuster
来改变这个想法。
你正在使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。
LocalDate
LocalDate
类表示没有时间且没有时区的仅限日期的值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因地区而异。例如,在Paris France午夜后的几分钟是新的一天,而Montréal Québec中仍然是“昨天”。
以continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
转到下个月。
LocalDate monthLater = today.plusMonths( 1 );
TemporalAdjuster
要移至该月的第三个星期二,请使用TemporalAdjuster
课程中的TemporalAdjusters
实施。
对于“月中的第三个星期二”或“本月的第一个星期四”等一个月内的序数星期几,Java提供了一个特定的调整器:TemporalAdjusters.dayOfWeekInMonth
。将3
之类的序号传递给“第三”,将DayOfWeek
枚举对象常量传递给DayOfWeek.TUESDAY
。
TemporalAdjuster ta = TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.TUESDAY ); // Pass ordinal number and `DayOfWeek`.
LocalDate thirdTuesdayOfNextMonth = monthLater.with( ta );
转储到控制台。
System.out.println( "today is " + today + " in zone " + z );
System.out.println( "Third Tuesday of next month is " + thirdTuesdayOfNextMonth );
请参阅此code run live at IdeOne.com。
今天是2018年至2012年在美国/蒙特利尔地区
下个月的第三个星期二是2018-02-20
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。