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

时间:2017-11-23 13:39:00

标签: java date date-range

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

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

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

2 个答案:

答案 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

再次,检查这是否是你想要的。