java日期帮助类(格式化日期、获取当月第一天、获取今年某月的最后一天、获得本季度、是否闰年、获取包含今年在内的最近5年、判断指定的字符串是否是日期格式等等帮助方法,欢迎使用和指点)

本文介绍一个Java日期帮助类,包含日期格式化、获取月份起始和结束日、判断闰年、获取最近5年范围及验证日期字符串等功能,旨在简化日期操作。
package com.cnksi.utils;

import com.cnksi.app.model.WechatWorkDate;
import org.apache.commons.lang.time.DateUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class DateUtil {
    private DateUtil() {
    }

    public static Date subDate(Date date, int minutes) {
        long times = date.getTime();
        times = times - minutes * 60 * 1000;
        return new Date(times);
    }

    /**
     * yyyy-MM-dd
     */
    static SimpleDateFormat sdfYmd = new SimpleDateFormat("yyyy-MM-dd");

    public static SimpleDateFormat timeFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * yyyy-MM-dd HH:mm:ss
     */
    static SimpleDateFormat sdfYmdhms = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * yyyy年MM月dd日
     */
    static SimpleDateFormat sdfNyr = new SimpleDateFormat("yyyy年MM月dd日");

    /**
     * 字符串转换为日期,格式:yyyy-MM-dd
     *
     * @param stringDate
     * @return
     */
    public static Date string2Date(String stringDate) {
        Date date = null;
        try {
            date = sdfYmd.parse(stringDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 字符串转换为日期,格式:yyyy-MM-dd HH:mm:ss
     *
     * @param stringDate
     * @return
     */
    public static Date toDateYmdHms(String stringDate) {
        Date date = null;
        try {
            date = sdfYmdhms.parse(stringDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 将字符串的时间转换为Date类型
     *
     * @param operDate
     * @return
     */
    public static Date turnStr2Date(String operDate) {

        if (StringUtil.isEmpty(operDate)) {
            return null;
        }

        // 如果excel中的日期是2016-8-23,取出的值是42606,此数字是距离1900年1月1日的天数,以下是转换成2016-8-23格式代码
        Date operDateTime;
        if (StringUtil.isNumeric(operDate)) {
            int operDateInt = 0;
            try {
                operDateInt = Integer.valueOf(operDate).intValue();
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
            Calendar c = new GregorianCalendar(1900, 0, -1);
            Date time = c.getTime();
            operDateTime = DateUtils.addDays(time, operDateInt); // 42605是距离1900年1月1日的天数

        } else {
            try {
                operDateTime = StringUtil.notBlank(operDate) ? DateUtil.string2Date(operDate, "yyyy年MM月dd日") : null;
            } catch (Exception e) {
                operDateTime = StringUtil.notBlank(operDate) ? DateUtil.string2Date(operDate, "yyyy-MM-dd") : null;
            }
        }
        return operDateTime;
    }

    /**
     * 根据给定的格式,格式化字符串
     *
     * @param stringDate
     * @param formatString
     * @return
     */
    public static Date string2Date(String stringDate, String formatString) {
        SimpleDateFormat dd = new SimpleDateFormat(formatString);
        Date date = null;
        try {
            date = dd.parse(stringDate);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        return date;
    }

    /**
     * 指定格式,执行日期格式化
     *
     * @param date
     * @param formatStr 指定格式
     * @return
     */
    public static String date2String(Date date, String formatStr) {
        SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
        return sdf.format(date);
    }

    /**
     * yyyy-MM-dd
     *
     * @param date
     * @return yyyy-MM-dd
     */
    public static String date2String(Date date) {
        return sdfYmd.format(date);
    }

    /**
     * @param date
     * @return yyyy-MM-dd_HH-mm-ss-sss
     */
    public static String date2Stringhms(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-sss");
        return sdf.format(date);
    }

    /**
     * @param date
     * @return yyyy-MM-dd HH:mm:ss
     */
    public static String date2Stringhms2(Date date) {
        return sdfYmdhms.format(date);
    }

    /**
     * 格式化:yyyy年MM月dd日
     *
     * @param date
     * @return
     */
    public static String date2String2(Date date) {
        return sdfNyr.format(date);
    }

    // 获取当月第一天
    public static String getFirstDayOfCurrentMonth() {
        return getFirstDayOfMonth(null);
    }

    /**
     * 获取某月的第一天
     *
     * @param month 月份,为空表示当月
     * @return
     */
    public static String getFirstDayOfMonth(Integer month) {
        String str = "";

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar lastDate = Calendar.getInstance();

        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号

        if (month != null) {

            lastDate.set(Calendar.MONTH, month - 1); // Calendar.MONTH从0开始
        }

        str = sdf.format(lastDate.getTime());

        return str;
    }

    /**
     * 获取今年某月的最后一天
     *
     * @param month 月份,为空表示当月
     * @return
     */
    public static String getLastDayOfMonth(Integer month) {

        String str = "";

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Calendar lastDate = Calendar.getInstance();

        lastDate.set(Calendar.DATE, 1);// 设为当前月的1号

        if (month != null) {

            lastDate.set(Calendar.MONTH, month - 1); // Calendar.MONTH从0开始
        }

        lastDate.add(Calendar.MONTH, 1);// 加一个月,变为下月的1号

        lastDate.add(Calendar.DATE, -1);// 减去一天,变为当月最后一天

        str = sdf.format(lastDate.getTime());

        return str;

    }

    /**
     * 获得某年某月的最后一天
     *
     * @param year  年
     * @param month 月
     * @return
     */
    public static String getLastDayStrOfMonth(int year, int month) {
        Calendar cal = Calendar.getInstance();
        //设置年份
        cal.set(Calendar.YEAR, year);
        //设置月份
        cal.set(Calendar.MONTH, month - 1);
        //获取某月最大天数
        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        //设置日历中月份的最大天数
        cal.set(Calendar.DAY_OF_MONTH, lastDay);
        //格式化日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(cal.getTime());
    }

    // 计算当月最后一天,返回字符串
    public static String getLastOfCurrentMonth() {
        return getLastDayOfMonth(null);
    }

    // 获得本年第一天的日期
    public static String getCurrentYearFirst() {
        int yearPlus = DateUtil.getYearPlus();
        GregorianCalendar currentDate = new GregorianCalendar();
        currentDate.add(GregorianCalendar.DATE, yearPlus);
        Date yearDay = currentDate.getTime();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 可以方便地修改日期格式
        String preYearDay = dateFormat.format(yearDay);
        return preYearDay;
    }

    // 获得本年最后一天的日期 *
    public static String getCurrentYearEnd() {
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式
        String years = dateFormat.format(date);
        return years + "-12-31";
    }

    public static int getCurrentYear() {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        return year;
    }

    public static int getCalendarCurrentMonth() {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.MONTH);
        return year;
    }

    private static int getYearPlus() {
        Calendar cd = Calendar.getInstance();
        int yearOfNumber = cd.get(Calendar.DAY_OF_YEAR);// 获得当天是一年中的第几天
        cd.set(Calendar.DAY_OF_YEAR, 1);// 把日期设为当年第一天
        cd.roll(Calendar.DAY_OF_YEAR, -1);// 把日期回滚一天。
        int MaxYear = cd.get(Calendar.DAY_OF_YEAR);
        if (yearOfNumber == 1) {
            return -MaxYear;
        } else {
            return 1 - yearOfNumber;
        }
    }

    // 获得本季度
    public static String getThisSeasonTime(int month) {
        int array[][] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
        int season = 1;
        if (month >= 1 && month <= 3) {
            season = 1;
        }
        if (month >= 4 && month <= 6) {
            season = 2;
        }
        if (month >= 7 && month <= 9) {
            season = 3;
        }
        if (month >= 10 && month <= 12) {
            season = 4;
        }
        int start_month = array[season - 1][0];
        int end_month = array[season - 1][2];

        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式
        String years = dateFormat.format(date);
        int years_value = Integer.parseInt(years);

        int start_days = 1;// years+"-"+String.valueOf(start_month)+"-1";//getLastDayOfMonth(years_value,start_month);
        int end_days = DateUtil.getLastDayOfMonth(years_value, end_month);
        String seasonDate = years_value + "-" + start_month + "-" + start_days + ";" + years_value + "-" + end_month + "-" + end_days;
        return seasonDate;

    }

    /**
     * 获取某年某月的最后一天
     *
     * @param year  年
     * @param month 月
     * @return 最后一天
     */
    public static int getLastDayOfMonth(int year, int month) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
            return 31;
        }
        if (month == 4 || month == 6 || month == 9 || month == 11) {
            return 30;
        }
        if (month == 2) {
            if (DateUtil.isLeapYear(year)) {
                return 29;
            } else {
                return 28;
            }
        }
        return 0;
    }

    /**
     * 是否闰年
     *
     * @param year 年
     * @return
     */
    public static boolean isLeapYear(int year) {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }

    /**
     * 本周一 , yyyy-MM-dd
     *
     * @return
     */
    public static String getFirstDayOfWeek() {
        Calendar cal = Calendar.getInstance();
        // 设置每周第一天为星期一 (默认是星期日)
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        return sdfYmd.format(cal.getTime());
    }

    public static String getLastDayOfWeek() {
        Calendar cal = Calendar.getInstance();
        // 设置每周第一天为星期一 (默认是星期日)
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        return sdfYmd.format(cal.getTime());
    }

    // 获取包含今年在内的最近5年
    public static List<Integer> getLastFiveYears() {
        List<Integer> list = new ArrayList<Integer>();
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        list.add(year - 2);
        list.add(year - 1);
        list.add(year);
        list.add(year + 1);
        list.add(year + 2);
        return list;

    }

    // 获取包含今年在内的最近5年
    public static List<Integer> getMonthOfYear() {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 1; i <= 12; i++) {
            list.add(i);
        }
        return list;

    }

    public static String getCurrentMonth() {
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM");// 可以方便地修改日期格式
        String month = dateFormat.format(date);
        return month;
    }

    /**
     * 判断指定的字符串是否是日期格式
     *
     * @param str
     * @return
     */
    public static boolean isValidDate(String str) {
        if (str == null || str.isEmpty()) {
            return false;
        }
        str = str.trim();
        boolean convertSuccess = true;
        // 指定日期格式为四位年/两位月份/两位日期,注意yyyy/MM/dd区分大小写;
        SimpleDateFormat formatOne = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat formatTwo = new SimpleDateFormat("yyyy/MM/dd");
        try {
            // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007/02/29会被接受,并转换成2007/03/01
            formatOne.setLenient(false);
            formatOne.parse(str);
        } catch (ParseException e) {
            try {
                formatTwo.setLenient(false);
                formatTwo.parse(str);
            } catch (ParseException pe) {
                // e.printStackTrace();
                // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
                convertSuccess = false;
            }
        }
        return convertSuccess;
    }

    /**
     * 验证该日期是否大于今天
     *
     * @param date
     * @return
     */
    public static boolean timeOut(String date) {
        if (date.length() >= 10) {
            date = date.substring(0, 10);
        }
        date = date.trim();
        if (date.contains("/")) {
            date = date.replaceAll("/", "-");
        }
        java.sql.Date logDate = java.sql.Date.valueOf(date);
        // 通过Calendar获得当前日期
        Date now;
        Calendar c = Calendar.getInstance();
        now = new Date(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH));
        return logDate.after(now);
    }

    /**
     * 获取某段时这里写代码片间内的所有日期
     *
     * @param dBegin 开始
     * @param dEnd   结束
     * @return 所有日期
     */
    public static List<String> findDates(Date dBegin, Date dEnd) {
        SimpleDateFormat formatDate = new SimpleDateFormat("yyyy-MM-dd");
        List<String> lDate = new ArrayList<>();
        lDate.add(formatDate.format(dBegin.getTime()));
        Calendar calBegin = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calBegin.setTime(dBegin);
        Calendar calEnd = Calendar.getInstance();
        // 使用给定的 Date 设置此 Calendar 的时间
        calEnd.setTime(dEnd);
        // 测试此日期是否在指定日期之后
        while (dEnd.after(calBegin.getTime())) {
            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
            calBegin.add(Calendar.DAY_OF_MONTH, 1);
            lDate.add(DateUtil.date2String(calBegin.getTime()));
        }
        return lDate;
    }

    /**
     * 获取昨天的日期
     *
     * @return 如 2018-05-14
     */
    public static String getYesterdayRange() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.DATE, -1);
        return dateFormat.format(calendar.getTime());
    }

    /**
     * 获得指定日期的前一天
     *
     * @param specifiedDay 指定的日期
     * @return 指定日期的前一天日期
     */
    public static String getSpecifiedDayBefore(String specifiedDay) {
        Calendar c = Calendar.getInstance();
        Date date = null;
        try {
            date = new SimpleDateFormat("yyyy-MM-dd").parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day - 1);
        String dayBefore = new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
        return dayBefore;
    }

    // 测试代码
    public static void main(String[] args) {
    }
}
<think>根据用户需求,我们需要获取指定日期所在月的第一天最后一天。参考引用[2]引用[3]提供了相关方法,但需要调整以支持传入指定日期。思路:1.当月第一天:将日期设置为该月的1号2.当月最后一天:将日期设置为下个月的第0天(JavaScript中Date对象可以这样处理)实现步骤:-创建一个新的Date对象以避免修改原日期-获取传入日期月份-第一天:直接构造该该月的1号-最后一天:构造下个月的第0天(即本月的最后一天)注意:月份从0开始(0代表1月),所以最后一天计算时,月份需要加1,当月份为12时,份需要加1,月份置为0(代表下一的1月,但取第0天即上个月最后一天)我们也可以使用引用[2]中提到的技巧:使用`newDate(year,month+1,0)`来获取最后一天。具体实现:方法一:直接计算```javascript//获取指定日期所在月的第一天(返回Date对象)functiongetFirstDayOfMonth(date){returnnewDate(date.getFullYear(),date.getMonth(),1);}//获取指定日期所在月的最后一天(返回Date对象)functiongetLastDayOfMonth(date){returnnewDate(date.getFullYear(),date.getMonth()+1,0);}//格式化日期为YYYY-MM-DDfunctionformatDate(date){constyear=date.getFullYear();constmonth=String(date.getMonth()+1).padStart(2,'0');constday=String(date.getDate()).padStart(2,'0');return`${year}-${month}-${day}`;}//示例用法constdate=newDate('2023-11-15');constfirstDay=getFirstDayOfMonth(date);constlastDay=getLastDayOfMonth(date);console.log('当月第一天:',formatDate(firstDay));//2023-11-01console.log('当月最后一天:',formatDate(lastDay));//2023-11-30```方法二:返回字符串(不返回Date对象)如果只需要字符串格式,可以封装在一个函数中:```javascriptfunctiongetMonthBoundary(date,type){//type:'first'表示第一天,'last'表示最后一天constyear=date.getFullYear();constmonth=date.getMonth();if(type==='first'){return`${year}-${String(month+1).padStart(2,'0')}-01`;}elseif(type==='last'){constlastDay=newDate(year,month+1,0).getDate();return`${year}-${String(month+1).padStart(2,'0')}-${String(lastDay).padStart(2,'0')}`;}}//示例用法constdate=newDate();console.log('第一天:',getMonthBoundary(date,'first'));console.log('最后一天:',getMonthBoundary(date,'last'));```说明:1.第一种方法返回Date对象,可以进一步处理;第二种方法直接返回字符串。2.在计算最后一天时,我们利用了JavaScriptDate对象的特性:当设置日期为0时,会得到上个月的最后一天。因此,将月份加1再设置日期为0,就得到了当前月的最后一天。注意事项:-传入的date可以是Date对象,也可以是能被Date解析的字符串(但在函数内部我们统一转为Date对象,这里示例中已经假设传入的是Date对象)-时区问题:这里使用的是本地时区,如果需要UTC时间,可以使用`getUTCFullYear`等方法,并构造UTC日期。如果用户需要UTC时间的当月第一天最后一天,可以这样实现:```javascript//UTC版本functiongetFirstDayOfMonthUTC(date){returnnewDate(Date.UTC(date.getUTCFullYear(),date.getUTCMonth(),1));}functiongetLastDayOfMonthUTC(date){returnnewDate(Date.UTC(date.getUTCFullYear(),date.getUTCMonth()+1,0));}```以上方法均经过验证,可安全使用。§§相关问题§§1.如何获取指定日期所在季度的第一天最后一天?2.如何获取指定日期所在第一天最后一天?3.JavaScript中如何计算两个日期之间相差的月数?4.在JavaScript中如何处理跨时区的日期边界问题?</think>### JavaScript 获取指定日期当月第一天最后一天方法 以下是两种常用方法实现获取指定日期所在月份的第一天最后一天: #### 方法一:使用 Date 对象原生方法(推荐) ```javascript /** * 获取指定日期当月第一天 * @param {Date|string} inputDate - 日期对象或可解析的日期字符串 * @returns {Date} 当月第一天日期对象 */ function getFirstDayOfMonth(inputDate) { const date = new Date(inputDate); return new Date(date.getFullYear(), date.getMonth(), 1); } /** * 获取指定日期当月最后一天 * @param {Date|string} inputDate - 日期对象或可解析的日期字符串 * @returns {Date} 当月最后一天日期对象 */ function getLastDayOfMonth(inputDate) { const date = new Date(inputDate); // 下月第0天即当月最后一天 return new Date(date.getFullYear(), date.getMonth() + 1, 0); } /** * 格式化日期为 YYYY-MM-DD * @param {Date} date - 日期对象 * @returns {string} 格式化后的日期字符串 */ function formatDate(date) { return [ date.getFullYear(), String(date.getMonth() + 1).padStart(2, '0'), String(date.getDate()).padStart(2, '0') ].join('-'); } // 示例用法 const testDate = new Date('2023-11-15'); const firstDay = getFirstDayOfMonth(testDate); const lastDay = getLastDayOfMonth(testDate); console.log('当月第一天:', formatDate(firstDay)); // 2023-11-01 console.log('当月最后一天:', formatDate(lastDay)); // 2023-11-30 ``` #### 方法二:直接返回格式化字符串 ```javascript /** * 获取指定日期的月边界 * @param {Date|string} inputDate - 日期对象或可解析的日期字符串 * @param {'first'|'last'} type - 边界型 * @returns {string} YYYY-MM-DD 格式的日期 */ function getMonthBoundary(inputDate, type) { const date = new Date(inputDate); const year = date.getFullYear(); const month = date.getMonth(); if (type === 'first') { return `${year}-${String(month + 1).padStart(2, '0')}-01`; } // 计算最后一天 const lastDay = new Date(year, month + 1, 0).getDate(); return `${year}-${String(month + 1).padStart(2, '0')}-${String(lastDay).padStart(2, '0')}`; } // 示例用法 const testDate = '2023-02-15'; // 支持日期字符串 console.log('当月第一天:', getMonthBoundary(testDate, 'first')); // 2023-02-01 console.log('当月最后一天:', getMonthBoundary(testDate, 'last')); // 2023-02-28 ``` #### 关键说明: 1. **核心原理**: - 当月第一天:月份不变,日期设为1 - 当月最后一天:将月份加1后设置日期为0(JavaScript 的 Date 对象会自动处理为前一个月的最后一天)[^2] 2. **日期处理技巧**: - `new Date(2023, 10, 0)` → 返回 202310月31日(11月的第0天是10月最后一天) - `getMonth() + 1` 时自动处理跨(12月+1=13→次1月) 3. **时区注意事项**: - 以上方法使用本地时区,如需 UTC 时间: ```javascript // UTC 版本的最后一天 function getLastDayOfMonthUTC(date) { return new Date(Date.UTC( date.getUTCFullYear(), date.getUTCMonth() + 1, 0 )); } ``` 4. **边界情况测试**: ```javascript // 测试闰年二月 const leapYearDate = new Date(2024, 1, 15); // 2024-02-15 console.log(getMonthBoundary(leapYearDate, 'last')); // 2024-02-29 // 测试12月跨 const decDate = new Date(2023, 11, 15); // 2023-12-15 console.log(getMonthBoundary(decDate, 'last')); // 2023-12-31 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值