微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java LocalDate如何利用

如何解决Java LocalDate如何利用

输入列表

  1. 从日期开始2020-10-01
  2. 至今ex)2020-10-30
  3. 列出[星期几]例如)[星期日,星期一...]
  4. 列表[周]例如)[1,4,5]

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

解决方法

从日期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的更多信息。

,
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);
                }
            }
        }
    }

很抱歉提出了错误的问题。 非常感谢你。

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

,

java.time

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

    LocalDate fromDate = LocalDate.of(2020,Month.OCTOBER,1);
    LocalDate toDate = LocalDate.of(2020,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对象,以确保尊重所选的周计划。

如果您需要涵盖一个以上的日历月,请对月份进行迭代,并对每个月进行相同的操作。另外,请检查结果日期是否在月份内,以便忽略月份边界附近的重复项。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。