【问题标题】:Convert Calendar set DAY_OF_WEEK to use TemporalAdjusters转换日历集 DAY_OF_WEEK 以使用 TemporalAdjusters
【发布时间】:2020-05-18 04:09:21
【问题描述】:

我有一些像这样的遗留代码

        final Calendar cal = new GregorianCalendar();
        cal.setTime(today);
        // changed on May-03-2004
        //cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
        if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            cal.add(Calendar.DAY_OF_YEAR, -6);
        } else {
            cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        }
        //System.out.println("Begin of cycle: " + cal.getTime());

我想将它转换为使用 java.time TemporalAdjuster 类,希望它更具可读性。

但我不确定如何解释 https://stackoverflow.com/a/1319484/242042 以使行为匹配。

【问题讨论】:

    标签: java java-time dayofweek java.util.calendar


    【解决方案1】:

    假设today 确实是今天的日期,那么使用TemporalAdjusters 的Java Time API 版本将是:

    LocalDate today = LocalDate.now();
    
    TemporalAdjuster adjuster = TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY);
    LocalDate monday = today.with(adjuster);
    
    System.out.println(today + " -> " + monday);
    

    样本输出

    2020-02-01 -> 2020-01-27
    

    2020-02-01 是星期六,2020-01-27 是前一个星期一。

    【讨论】:

      【解决方案2】:

      DayOfWeek 实现 TemporalAdjuster

      我认为您的代码尝试将 Calendar 对象设置为同一 ISO 周的星期一,也就是说,如果今天还不是星期一,则为今天之前的星期一(这并不总是在所有语言环境中都是结果,尽管)。当您知道如何操作时,这真的很简单。

          LocalDate today = LocalDate.of(2020, Month.FEBRUARY, 2);
          LocalDate monday = today.with(DayOfWeek.MONDAY);
          System.out.println("Monday of the same week is " + monday + ", a " + monday.getDayOfWeek());
      

      这个 sn-p 的输出是:

      同一周的星期一是 2020-01-27,一个星期一

      LocalDate 始终使用 ISO 日历,其中星期一是一周的第一天,所以 today.with(DayOfWeek.MONDAY) 给你同一周的星期一,换句话说,今天的前一个星期一还不是星期一. GregorianCalendar 使用了默认语言环境的周定义,这在代码中造成了一些复杂性,以确保它在星期天是一周的第一天的语言环境中也能正确运行。 LocalDate 在所有语言环境中的行为都相同,这也是使用 LocalDate 的代码更简单的原因之一。

      【讨论】:

        【解决方案3】:

        https://repl.it/@trajano/setCal尝试不同的组合之后就可以了

        代码翻译成

          public static LocalDate doIt(LocalDate todayDate) {
            final LocalDate c2;
            if (todayDate.getDayOfWeek() == DayOfWeek.SUNDAY) {
              c2 = todayDate.minusDays(6);
            } else {
              c2 = todayDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
            }
            return c2;
        
          }
        

        【讨论】:

        • 为什么要有if 声明? with(previousOrSame(MONDAY)) 不会和 minusDays(6) 在星期天做同样的事情吗?
        • 但看起来你是对的我只是试图在我的 Repl 上评论它,谢谢这简化了事情。
        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多