Java - 获取上一年相同的每周日期范围

Java - get the same weekly date range for the previous year

我需要根据当前日期获取当前周和上一年同一周的某些数据。

例如,今天是 23/11/2017 - 星期四。 我有本周的下一个日期范围:20/11/2017(星期一)- 23/11/2017(星期四)。

获得上一年对应的每周日期范围(21/11/2016(星期一)- 24/11/2016(星期四))的最佳方法是什么?

必须制作规范文件,业务方应确认。

Today is 23/11/2017 - Thursday. So the current week is: 20/11/2017 (Monday) - 26/11/2017 (Sunday).

In the previous year we take today 23/11/2017 and subtract a year.. That is a Wednesday 23/11/2016.

We obtain the week: 21/11/2016 (Monday) - 27/11/2016 (Sunday).

A. Irregularity: 29th of February becomes the 28th in the previous year.

B. We are interested only in Monday - Thursday of the result, but do all, so we can work on Saturday as well.

然后考虑周数和周数。 备选:

Today is 23/11/2017 - Thursday. This is the week with week number 47, with week year 2017. (01/01/2017 would be in week 52 of week year 2016). Yield week 47 of previous week year 2016.

A. 53 possibly becomes 52 if there is no week 53.

B. Start of January can be of the previous week year.

如您所见,不应简单地实施,而应记录此类业务逻辑。


顺便说一下,新的 java 日期时间 API 很棒。

困难的部分是定义你想要什么以及你想要它在哪个时区。后者是正确的,因为在撰写本文时是 11 月 23 日在斯摩棱斯克,但在世界其他地方已经是 11 月 24 日, 所以你需要决定。

我是这样理解你的问题的,请检查是否正确:找到从本周开始(星期一)到今天的日期范围。然后找到一个去年的范围,从星期一到今天的同一天,尽可能接近相同的日期。这意味着您总是希望回到 52 周之前。然后你会得到一天后的日期(如果是闰年的 2 月 29 日,则晚两天),这将永远是你能得到的最接近的日期。

有了java.time,现代的Java日期和时间API,代码很简单:

    LocalDate today = LocalDate.now(ZoneId.of("Europe/Moscow"));
    LocalDate firstDayOfWeek 
            = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
    System.out.println("This year: " + firstDayOfWeek + " - " + today);

    LocalDate firstDayLastYear = firstDayOfWeek.minusWeeks(52);
    LocalDate correspondingDayLastYear = today.minusWeeks(52);
    System.out.println("Last year: " + firstDayLastYear + " - "
                        + correspondingDayLastYear);

运行 刚才打印的是:

This year: 2017-11-20 - 2017-11-23
Last year: 2016-11-21 - 2016-11-24

如果这不是您想要的时区,请用您想要的时区代替 Europe/Moscow。

如果您还想打印星期几,请使用 DateTimeFormatter

    DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofPattern("d/M/uuuu (EEEE)", Locale.forLanguageTag("ru"));
    System.out.println("This year: " + firstDayOfWeek.format(dateFormatter) + " - "
            + today.format(dateFormatter));

这会打印:

This year: 20/11/2017 (понедельник) - 23/11/2017 (четверг)

如果您 运行 2018 年 12 月 31 日的代码,您将无法回到 2017 年:

This year: 2018-12-31 - 2018-12-31
Last year: 2018-01-01 - 2018-01-01

再次检查这是否是您想要的。