开发者社区 问答 正文

Java日期处理

我试图用月号,月中的周号和周中的某天的日期获取日期,我认为这很容易,并且做到了:

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以及如何解决这个问题?

展开
收起
几许相思几点泪 2019-12-08 21:43:08 439 分享 版权
阿里云 AI 助理回答

看起来你是在使用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标准下,第一周被定义为包含该月第一天的那一周,这可能与某些地区对“第一周”的定义有所不同。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: