【问题标题】:Java 8 Date API - Get total number of weeks in a monthJava 8 Date API - 获取一个月的总周数
【发布时间】:2019-01-04 15:24:26
【问题描述】:

我有一个 Kotlin 函数来获取一个月的总周数

代码

fun getTotalWeeksInMonth(instant: Instant): Int {
    val calendar = Calendar.getInstance()
    calendar.time = Date.from(instant)

    return calendar.getActualMaximum(Calendar.WEEK_OF_MONTH)
}

但是,这是混合使用旧的 Java 日期/时间 API(DateCalendar)和新的 API(Instant

仅使用新的 API,我将如何获得相同的结果?

【问题讨论】:

  • "defined as such" ...你还没有定义任何东西。你想要什么?什么是“一个月的总周数”?
  • @Michael 例如,2019 年 1 月跨越 5 周,但我不想使用已弃用的 API 找出这一点
  • @deHaar 这正是问题所在。
  • @series0ne 好吧,你对一周的定义是什么?英国使用星期一作为一周的开始,美国使用星期日。
  • @Michael 假设您想找到 2019 年 1 月的最后一个星期日。那是 27 日。但是假设你想找到 2019 年 1 月的第 5 个星期日。那个日期不存在,因为 2019 年 1 月只有 4 个星期日。但是同样不适用于 2019 年 3 月,因为有五个星期日,所以我需要一个函数来确定该月有多少周? - 除非你能想出更好的方法来做到这一点?

标签: java datetime kotlin java-8 date


【解决方案1】:

你可以试试这对线:

YearMonth currentYearMonth = 
    YearMonth.now( 
        ZoneId.systemDefault() 
    )
;
int weeks = 
    currentYearMonth
    .atEndOfMonth()
    .get(
        WeekFields.ISO.weekOfMonth()
    )
;

【讨论】:

  • 年月不用getter就行,YearMonth.from(date)
  • 另外,weekOfMonth 带有大量警告。
  • @Michael 我编辑了代码。实际上不需要LocalDate 代码。我们可以用YearMonth.now捕获当前的YearMonth
【解决方案2】:

您可以在 java 中评估本月最后一天的“一个月中的一周”:

static int getTotalWeeksInMonth(Instant instant) {
    LocalDate localDate = LocalDate.ofInstant(instant, ZoneId.systemDefault());
    LocalDate lastDayOfMonth = localDate.withDayOfMonth(localDate.lengthOfMonth());
    int lastWeekOfMonth = lastDayOfMonth.get(WeekFields.ISO.weekOfMonth());
    return lastWeekOfMonth;
}

【讨论】:

    【解决方案3】:

    看看这是否适合你,注意你实际传递的Zone,以及WeekFields.ISO,在某些地区它可能工作正常,但在其他地区可能不行:

    Instant now = Instant.now();
    
    ZonedDateTime zonedNow = now.atZone(ZoneId.systemDefault());
    ZonedDateTime monthEnd = zonedNow.with(TemporalAdjusters.lastDayOfMonth());
    
    System.out.println(monthEnd.get(WeekFields.ISO.weekOfMonth()));
    

    【讨论】:

      【解决方案4】:

      拥有Instant 我会先将其转换为日期:

      val date = LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
      

      然后选择任何一个

      YearMonth.from(date).atEndOfMonth().get(ChronoField.ALIGNED_WEEK_OF_MONTH)
      

      YearMonth.from(date).atEndOfMonth().get(WeekFields.ISO.weekOfMonth())
      

      完整示例:

      fun getTotalWeeksInMonth(instant: Instant): Int {
          val date = LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
          return YearMonth.from(date).atEndOfMonth().get(ChronoField.ALIGNED_WEEK_OF_MONTH)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        相关资源
        最近更新 更多