【问题标题】:Java - get the same weekly date range for the previous yearJava - 获得与前一年相同的每周日期范围
【发布时间】:2017-11-23 13:39:00
【问题描述】:

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

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

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

【问题讨论】:

  • 请定义您所说的同一周是什么意思,是财政周吗?
  • 是的,金融周。
  • 我需要根据相对于当前日期的星期几获取上一年的每周日期范围
  • 听起来你总是想倒退 52 周。这样,去年的一周将晚一天(如果在闰年跨越 2 月 29 日,则晚两天),如果您想要一周中的同一天,这将尽可能接近。这样可以吗?当然,如果你从 12 月 31 日星期一回去,你会碰到 1 月 1 日星期一,也就是说,你连上一年都没有。
  • 我投票以“不清楚”结束,因为正如其他人评论的那样,您还没有定义周的含义。提示:ISO 8601 week.

标签: java date date-range


【解决方案1】:

您必须制作一份规范文件,业务方应予以确认。

今天是 23/11/2017 - 星期四。所以本周是:20/11/2017 (星期一)- 26/11/2017(星期日)。

在上一年,我们取今天 23/11/2017 并减去一年.. 那是 2016 年 11 月 23 日星期三。

我们获得星期:21/11/2016(星期一)- 27/11/2016(星期日)。

A.异常:2 月 29 日变为上一个 28 日 年。

B.我们只对结果的周一至周四感兴趣, 但尽一切努力,这样我们周六也可以工作。

然后考虑周数和周数。 替代方案

今天是 23/11/2017 - 星期四。这是第 47 周的一周, 周年 2017。(01/01/2017 将在周年的第 52 周 2016)。 2016 年上一周的第 47 周。

A.如果没有第 53 周,53 可能会变成 52。

B.一月初 可以是前一周的年份。

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


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

【讨论】:

    【解决方案2】:

    困难的部分是定义你想要什么以及你想要它在哪个时区。后者是正确的,因为在撰写本文时,斯摩棱斯克是 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
    

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

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      相关资源
      最近更新 更多