Java获取本月第一天和最后一天

在Java中,我们经常会遇到需要获取本月第一天和最后一天的情况。例如,在统计月度报表、计算工资等场景下,我们需要获取当前月份的开始日期和结束日期。本文将介绍如何使用Java代码获取本月第一天和最后一天,并提供相关的代码示例。

方法一:使用Calendar类

Java中的Calendar类提供了一系列的方法,可以用于获取日期和时间的各个部分。我们可以利用这些方法来获取本月的第一天和最后一天。

import java.util.Calendar;

public class DateUtils {
    
    public static void main(String[] args) {
        // 获取本月第一天
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        String firstDayOfMonth = calendar.getTime().toString();
        System.out.println("本月第一天:" + firstDayOfMonth);

        // 获取本月最后一天
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        String lastDayOfMonth = calendar.getTime().toString();
        System.out.println("本月最后一天:" + lastDayOfMonth);
    }
}

上述代码中,我们首先通过Calendar.getInstance()方法获取一个Calendar实例,然后使用set()方法将日期设置为本月的第一天。接着,我们通过getTime()方法获取Calendar对象对应的Date对象,并转换为字符串输出。

接下来,我们使用set()方法将日期设置为本月的最后一天。getActualMaximum(Calendar.DAY_OF_MONTH)方法返回本月的最大天数。最后,我们同样使用getTime()方法将Calendar对象转换为字符串输出。

方法二:使用Java 8的LocalDate类

Java 8中引入了新的日期和时间API,其中的LocalDate类提供了获取日期的各个部分的方法,使得获取本月第一天和最后一天变得更加简单。

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

public class DateUtils {
    
    public static void main(String[] args) {
        // 获取本月第一天
        LocalDate firstDayOfMonth = LocalDate.now().withDayOfMonth(1);
        String firstDayOfMonthStr = firstDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println("本月第一天:" + firstDayOfMonthStr);

        // 获取本月最后一天
        LocalDate lastDayOfMonth = LocalDate.now().withDayOfMonth(firstDayOfMonth.lengthOfMonth());
        String lastDayOfMonthStr = lastDayOfMonth.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        System.out.println("本月最后一天:" + lastDayOfMonthStr);
    }
}

上述代码中,我们首先使用LocalDate.now()方法获取当前日期,并使用withDayOfMonth(1)方法将日期设置为本月的第一天。然后,我们使用format()方法将LocalDate对象转换为字符串,指定了日期的格式为"yyyy-MM-dd"。

接下来,我们通过firstDayOfMonth.lengthOfMonth()方法获取本月的最大天数,并使用withDayOfMonth()方法将日期设置为本月的最后一天。同样,我们将LocalDate对象转换为字符串输出。

甘特图

下面是一个使用甘特图表示上述代码的运行过程:

gantt
    dateFormat  YYYY-MM-DD
    title 获取本月第一天和最后一天

    section 使用Calendar类
    获取本月第一天          :a1, 2022-01-01, 7d
    获取本月最后一天        :a2, after a1, 7d

    section 使用LocalDate类
    获取本月第一天          :a3, after a2, 7d
    获取本月最后一天        :a4, after a3, 7d

类图

下面是一个使用类图表示上述代码中涉及的类和方法的关系:

classDiagram
    class Calendar {
        + static Calendar getInstance()
        + void set(int field, int value)
        + int getActualMaximum(int field)
        + Date getTime()
    }

    class LocalDate {
        + static LocalDate now()
        + LocalDate withDayOfMonth(int dayOfMonth)
        + int lengthOfMonth()
        + String format(DateTimeFormatter formatter)
    }

    class DateTimeFormatter {
        + static DateTimeFormatter ofPattern(String pattern)
    }

    class Date {
        + String toString()
    }

    class DateUtils {
        + static void main(String[] args)
    }

    Calendar ..> Date
    LocalDate ..> Date