困难的部分是定义你想要什么以及你想要它在哪个时区。后者是正确的,因为在撰写本文时,斯摩棱斯克是 11 月 23 日,但在世界其他地方已经是 11 月 24 日,所以你需要决定。
我这样理解您的问题,请检查是否正确:查找从本周开始(星期一)到今天的日期范围。然后找到去年的范围,从星期一到今天的同一天,尽可能接近相同的日期。这意味着您总是想回到 52 周。然后您将获得一天后的日期(如果在闰年跨越 2 月 29 日,则两天后),这将始终尽可能接近。
使用现代 Java 日期和时间 API java.time,代码很简单:
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
如果这不是您想要的,请替换您想要的时区而不是欧洲/莫斯科。
如果您也想打印星期几,请使用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
再次检查这是否是您想要的。