【问题标题】:Java LocalDate How to utilizeJava LocalDate 如何使用
【发布时间】:2021-01-05 00:30:54
【问题描述】:

输入列表

  1. 从日期前)2020-10-01
  2. 截至日期前)2020-10-30
  3. 列表 [星期几] 例如)[太阳,星期一....]
  4. 列表 [week] ex) [1,4,5]

我想知道如何在这两个日期之间获取一周中的特定日期。 谢谢。

【问题讨论】:

  • 老实说,按照 Stack Overflow 标准,这不是一个很好的问题。即使你不知道从哪里开始,也要从搜索开始,看看你是否可以一起尝试。如果失败,请发布问题并解释您发现了什么、尝试了什么以及失败的原因,我们会立即为您提供一个更好的起点来帮助您取得进步。 How do I ask a good question? 无论如何不要绝望,学习如何提出一个好问题需要一点时间,只要在你提出更多问题时继续学习。回头见。
  • 周列表,是一个月中的那一周,一年中的一周,还是……?这两个日期是否总是在同一个月或至少在同一年或至少相隔一年?
  • 这能回答你的问题吗? How to get all weekend between two specific day of month using java8 time API? [closed]你能在那个问题中用你自己的星期几代替周六和周日吗?

标签: java dayofweek localdate date-manipulation


【解决方案1】:

从日期 ex) 2020-10-01 到日期 ex) 2020-10-30

您的输入字符串已采用 ISO8601 格式的日期,因此无需显式提供 DateTimeFormatter 即可对其进行解析。为了获得自定义格式的输出字符串(例如yyyy-MM-dd),您需要使用DateTimeFormatter 格式化日期对象。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String inputStrDate = "2020-10-01";
        LocalDate date = LocalDate.parse(inputStrDate);

        String outputStrDate = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println(outputStrDate);
    }
}

输出:

2020-10-01

但是,如果您的输入是其他格式,则需要使用 DateTimeFormatter 才能将其解析为日期对象。

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Formatter for input string
        DateTimeFormatter inputFormat = DateTimeFormatter.ofPattern("dd-MM-yyyy");

        String inputStrDate = "10-01-2020";
        LocalDate date = LocalDate.parse(inputStrDate, inputFormat);

        // Formatter for output string
        DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        String outputStrDate = date.format(outputFormat);
        System.out.println(outputStrDate);
    }
}

输出:

2020-10-01

Trail: Date Time 了解有关日期时间 API 的更多信息。

【讨论】:

    【解决方案2】:
    for(LocalDate d = fromDate; !d.isAfter(toDate); d = d.plusDays(1)) { // 일정 시작 ~ 끝 loop
            for (Integer wf : weekOfMonth) {
                for (Integer df : dayOfWeek) {
                    offDay = d.with(fieldWeek, wf)
                            .with(fieldDay, df);
    
                    
                    if (d.getMonth() == offDay.getMonth() && !offDays.contains(offDay)) {
                        offDays.add(offDay);
                    }
                }
            }
        }
    

    很抱歉问错了问题。 非常感谢。

    我已经做到了,但我研究了你的代码。

    【讨论】:

      【解决方案3】:

      java.time

      我也建议您使用现代 Java 日期和时间 API java.time 来进行日期工作。我的镜头是:

          LocalDate fromDate = LocalDate.of(2020, Month.OCTOBER, 1);
          LocalDate toDate = LocalDate.of(2020, Month.OCTOBER, 30);
          List<DayOfWeek> daysOfWeek = List.of(DayOfWeek.SUNDAY, DayOfWeek.MONDAY);
          List<Integer> weeks = List.of(1, 4, 5);
          
          if (! YearMonth.from(fromDate).equals(YearMonth.from(toDate))) {
              throw new IllegalStateException("Covering more than one month is not yet supported");
          }
          
          WeekFields wf = WeekFields.SUNDAY_START;
          for (int week : weeks) {
              for (DayOfWeek dow : daysOfWeek) {
                  LocalDate date = fromDate.with(wf.weekOfMonth(), week)
                          .with(wf.dayOfWeek(), dow.get(wf.dayOfWeek()));
                  // Is date inside interval?
                  if (! (date.isBefore(fromDate)  || date.isAfter(toDate))) {
                      System.out.println(date);
                  }
              }
          }
      

      输出:

      2020-10-18
      2020-10-19
      2020-10-25
      2020-10-26
      

      打印的日期是 10 月第 4 周和第 5 周的星期日和星期一,以美国方式定义了星期从星期日开始的星期(因为您在示例列表中首先提到星期日),第 1 周是 10 月 1 日这一周。第 1 周的星期日和星期一没有打印出来,因为它们在 10 月 1 日之前,即 9 月。

      考虑您需要哪种周计划。例如,您可以使用 WeekFields.ISOWeekFields.of(Locale.getDefault())

      我首先找到星期,然后是星期几,因为对我来说这是很自然的方式。我需要使用WeekFields 对象进行这两项调整,以确保遵守所选的周计划。

      如果您需要覆盖多个日历月,请遍历这些月并为每个月执行相同的操作。还要检查结果日期是否在月份内,以便忽略月份边界附近的重复项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-02
        • 2015-05-25
        • 2021-05-25
        • 2021-11-21
        • 2023-03-23
        • 2021-08-28
        • 2015-05-23
        • 2019-07-17
        相关资源
        最近更新 更多