我试图用月号,月中的周号和周中的某天的日期获取日期,我认为这很容易,并且做到了:
nextBookingDate = now().with(Month.of(1)); //MonthOfYear = 1 (January)
nextBookingDate = now().with(WeekFields.ISO.weekOfMonth(), 1); //WeekOfMonth = 1 (First week in january)
nextBookingDate = now().with(DayOfWeek.of(1)); //DayOfWeek = 1 (Monday)
nextBookingDate应该是2020-01-06,因为它是一月份的第一个星期一。 但是为什么我会得到2019-12-30以及如何解决这个问题?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
看起来你是在使用Java 8中的java.time
包来处理日期和时间。问题在于你每次调用now().with()
时,都是基于当前时间重新开始计算的,而不是在前一步的基础上继续修改。这就导致了你的代码实际上并没有按你期望的那样依次设置月份、周号和周中某天。
要解决这个问题,你应该链式调用这些方法,确保所有的设定都是基于最初的时间点进行的,像这样:
import java.time.LocalDate;
import java.time.temporal.WeekFields;
import java.util.Locale;
public class DateExample {
public static void main(String[] args) {
LocalDate now = LocalDate.now();
LocalDate nextBookingDate = now.withMonth(1) // 设置月份为1月
.with(WeekFields.of(Locale.getDefault()).weekOfMonth(), 1) // 设置为1月的第一周
.with(DayOfWeek.MONDAY); // 设置为周一
System.out.println(nextBookingDate);
}
}
这段代码首先获取当前日期,然后基于这个日期设置月份为1月,接着设置为该月的第一周,最后设置为这一周的周一。这样就能正确得到2020-01-06(或相应年份的一月份第一个星期一)的结果了。
请注意,这里我使用了WeekFields.of(Locale.getDefault()).weekOfMonth()
来确保与你的示例一致,但通常ISO标准下,第一周被定义为包含该月第一天的那一周,这可能与某些地区对“第一周”的定义有所不同。