我需要根据当前日期获取本周和上一年同一周的某些数据。
例如,今天是2017年11月23日 - 周四。 我有本周的下一个日期范围:2017年11月20日(星期一) - 2017年11月23日(星期四)。
获得上一年(2016年11月21日(星期一) - 2016年11月24日(星期四))相应的每周日期范围的最佳方法是什么?
答案 0 :(得分:2)
您必须制作规范文档,业务方应予以确认。
今天是2017年11月23日 - 周四。所以本周是:2017年11月20日 (星期一) - 2017年11月26日(星期日)。
在前一年,我们采取今天23/11/2017并减去一年.. 那是2016年11月23日星期三。
我们获得一周:2016年11月21日(星期一) - 2016年11月27日(星期日)。
一个。不规范:2月29日成为之前的第28位 年。
B中。我们只对周一至周四的结果感兴趣, 但是要做所有,所以我们也可以在星期六工作。
然后考虑周&amp;周数。 <强>替代强>:
今天是2017年11月23日 - 周四。这是第47周的一周, 周年 2017年。(01/01/2017将在一周的第52周 2016)。 2016年前一周的收益率第47周。
一个。如果没有第53周,53可能会变成52。
B中。一月开始 可以是前一周。
如您所见,不应该简单地实现,而是记录这样的业务逻辑。
顺便说一句,新的java日期时间API很棒。
答案 1 :(得分:0)
困难的部分正在定义你想要的东西以及你想要的时区。后者是真的,因为在写作时它是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
如果这不是你想要的那个,请用你想要的时区代替欧洲/莫斯科。
如果您还要打印星期几,请使用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
再次,检查这是否是你想要的。