【问题标题】:Java 8 Date API - Get ordinal position of the day in the monthJava 8 Date API - 获取月份中一天的序数位置
【发布时间】:2019-01-06 02:18:52
【问题描述】:

受以下帖子启发

我需要一个函数来返回一个月中给定日期的序数位置,例如:

01/01/1970 = 1 因为这是 1970 年 1 月的第一个星期四

02/01/1970 = 1 因为这是 1970 年 1 月的第一个星期五

19/01/1970 = 3 因为这是 1970 年 1 月的第三个星期一

31/01/1970 = 5 因为这是 1970 年 1 月的第五个星期六

我尝试了什么? - 没什么……我什至不知道从哪里开始; Java 8 日期/时间 API 对我来说相当新。

理想情况下,我想要一个具有此签名的函数:

public int getOrdinalPosition(TemporalAccessor temporal) {
    ...
}

【问题讨论】:

  • 所以基数是指给定日期所在月份的周数?
  • 其实,求“nth”是ordinal而不是cardinal。序数意味着按位置计数。基数意味着计算数量。见:differencebetween.com/…
  • @BasilBourque 说得好,感谢您的更新!

标签: java java-8 date


【解决方案1】:

好吧,以 19/01/1970 为例。从中减去 7 天,现在仍然是 1 月。再减去 7 天,还是 1 月。第 4 次减去 7 天,然后……哦,嘿,现在已经不是一月了。您第 4 次删除 7 天时,它不再是正确的月份。

这就是你所需要的。

相关方法:for循环、计数器、minusDays(7)方法、getMonth()

【讨论】:

    【解决方案2】:

    ChronoField.ALIGNED_WEEK_OF_MONTH

    您可以使用LocalDate.get()ChronoField.ALIGNED_WEEK_OF_MONTH

    import java.time.LocalDate;
    import java.time.temporal.ChronoField;
    import java.time.temporal.TemporalAccessor;
    
    /**
     *
     * @author Sedrick
     */
    public class JavaApplication19 {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            // TODO code application logic here
            LocalDate localDate1 = LocalDate.of(1970, 01, 01);
            LocalDate localDate2 = LocalDate.of(1970, 02, 01);
            LocalDate localDate3 = LocalDate.of(1970, 01, 19);
            LocalDate localDate4 = LocalDate.of(1970, 01, 31);
    
    
            System.out.println(localDate1.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
            System.out.println(localDate2.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
            System.out.println(localDate3.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
            System.out.println(localDate4.get(ChronoField.ALIGNED_WEEK_OF_MONTH));
    
            System.out.println(getOrdinalPosition(localDate4));
        }
    
        static public int getOrdinalPosition(TemporalAccessor temporal) {
            return LocalDate.from(temporal).get(ChronoField.ALIGNED_WEEK_OF_MONTH);
        }
    }
    

    输出:

    run:
    1
    1
    3
    5
    5
    BUILD SUCCESSFUL (total time: 0 seconds)
    

    【讨论】:

    • 顺便说一下,应该是getOrdinalPosition(不是基数)。
    • @BasilBourque 我不知道有什么区别。我刚查了一下。你似乎是正确的。我刚刚复制了 OPs 模板。
    【解决方案3】:

    你需要的是ChronoField.ALIGNED_WEEK_OF_MONTH

    LocalDate.of(1970,1,1).get(ChronoField.ALIGNED_WEEK_OF_MONTH)      //1
    LocalDate.of(1970,1,2).get(ChronoField.ALIGNED_WEEK_OF_MONTH)      //1
    LocalDate.of(1970,1,19).get(ChronoField.ALIGNED_WEEK_OF_MONTH)     //3
    LocalDate.of(1970,1,31).get(ChronoField.ALIGNED_WEEK_OF_MONTH)     //5
    

    【讨论】:

      【解决方案4】:

      这似乎有效...

      public int getOrdinalPosition(TemporalAccessor temporal) {
          return ((LocalDate.from(temporal).getDayOfMonth() - 1) / 7) + 1;
      }
      

      【讨论】:

      • @RavindraRanwala 可读性在旁观者眼中;短代码往往会将举证责任放在较长的代码上,而您没有带来任何证据。这无论如何都不容易出错;它正是 OP 想要的(这不是“星期几”,而是“这是本月的第 X 个星期四;X 是什么?”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 1970-01-01
      相关资源
      最近更新 更多