有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何查找startDate和endDate之间的每周日期传递字符串,如“Wed,Thu”,它是动态传递的

当我通过startDate和endDate传递一周中的某一天时,比如字符串“Mon,Tue,Wed,Thu,Fri,Sat,Sun”,那么我希望每周的日期基于startDate和endDate之间通过的一周中的某一天

天可以是从传入方法的整周或自定义日

一,。我的试用码

public List<LocalDate> getWeeklyDateByStringofDays(String DaysofWeek, LocalDate startDate, LocalDate endDate) {
    List<String> daysOfWeekList = Arrays.asList(DaysofWeek.split(","));
    // How can do it no idea
}

共 (3) 个答案

  1. # 1 楼答案

    您可以按如下方式操作:

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            // Test
            System.out.println(getWeeklyDateByStringofDays("Mon, Tue, Wed", LocalDate.parse("2020-09-14"),
                    LocalDate.parse("2020-12-14")));
        }
    
        static List<LocalDate> getWeeklyDateByStringofDays(String daysOfWeek, LocalDate startDate, LocalDate endDate) {
            // Split the string on optional whitespace followed by comma which in turn may
            // be followed by optional whitespace
            String[] daysOfWeekList = daysOfWeek.split("\\s*,\\s*");
    
            // The list to be populated with desired dates and returned
            List<LocalDate> result = new ArrayList<>();
    
            // Formatter to get only day name e.g. Mon from the date
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE", Locale.ENGLISH);
    
            for (String day : daysOfWeekList) {
                // Loop starting with the startDate until the endDate with a step of one day
                for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
                    if (date.format(dtf).equals(day)) {
                        result.add(date);
                    }
                }
            }
    
            // Sort the list
            Collections.sort(result);
    
            return result;
        }
    }
    

    输出:

    [2020-09-14, 2020-09-15, 2020-09-16, 2020-09-21, 2020-09-22, 2020-09-23, 2020-09-28, 2020-09-29, 2020-09-30, 2020-10-05, 2020-10-06, 2020-10-07, 2020-10-12, 2020-10-13, 2020-10-14, 2020-10-19, 2020-10-20, 2020-10-21, 2020-10-26, 2020-10-27, 2020-10-28, 2020-11-02, 2020-11-03, 2020-11-04, 2020-11-09, 2020-11-10, 2020-11-11, 2020-11-16, 2020-11-17, 2020-11-18, 2020-11-23, 2020-11-24, 2020-11-25, 2020-11-30, 2020-12-01, 2020-12-02, 2020-12-07, 2020-12-08, 2020-12-09, 2020-12-14]
    

    注意:如果参数中的日期名称在任何情况下都可以是,请在上面给出的代码中将date.format(dtf).equals(day)替换为date.format(dtf).equalsIgnoreCase(day)

  2. # 2 楼答案

    1. 将DaysOfWeek输入字符串解析为List<DayOfWeek>对象。例如,首先调用.split("\\s*,\\s*")以获取包含MonTue等内容的字符串数组

    2. 将字符串"Mon"变成DayOfWeek.MONDAY。见下文

    3. 创建一个for循环,循环开始和结束之间的每个日期:for (LocalDate d = start; d.isBefore(end); d = d.plusDays(1))。每个日期,获取它代表的星期几,并检查它是否在您的列表中

    我如何将“Mon”转换为DOW。星期一

    您可以制作自己的hashmap,将字符串映射到DayOfWeek值。或者,您可以依赖java的日期解析,但这有点棘手:

    Locale where = Locale.forLanguageTag("en"); 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE", where);
    TemporalAccessor accessor = formatter.parse("monday");
    DayOfWeek dow = DayOfWeek.from(accessor);
    

    当然,请注意您必须如何指定语言。毕竟,在整个地球上,有很多方式可以说“星期一”:

  3. # 3 楼答案

    你可以从LocalDate中以三个字母的格式(例如Mon)获取DayOfWeek,并在daysOfWeek中检查包含内容

    localdate.getDayOfWeek().getDisplayName(TextStyle.SHORT, Locale.US))
    

    并使用Stream.iterate在范围内迭代,如果LocalDate中的DayOfWeek包含在daysOfWeek中,则过滤,然后在列表中收集localdates

      public List<LocalDate> getWeeklyDateByStringofDays(String daysOfWeek, LocalDate startDate,
          LocalDate endDate) {
        final int days = (int) startDate.until(endDate, ChronoUnit.DAYS);
        return Stream.iterate(startDate, d -> d.plusDays(1))
            .limit(days)
            .filter(d -> daysOfWeek.contains(d.getDayOfWeek()
                                              .getDisplayName(TextStyle.SHORT, Locale.US)))
            .collect(Collectors.toList());
      }