CalendarHelper日期计算工具,各种日期的获取和计算

今天分享一个日期获取和计算的工具类,这个最初是用在项目中获取每周每月日期用的。

package com.ran.interview;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

/**
 * @author BMR
 * @ClassName: CalendarHelper
 * @Description: 日期计算工具,标准格式yyyy-MM-dd下各种日期的获取和计算
 * @date 2016/2/26 16:08
 */
public class CalendarHelper {

    private static SimpleDateFormat yyyyMMddFormat;
    public final static String[] mMonthCN = new String[]{"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月",
            "九月", "十月", "十一月", "十二月"};

    public static void setup() {
        yyyyMMddFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
    }

    /**
     * 显示格式化的月日:eg,2013-03-27,convert to 03月27日
     *
     * @param dateStr eg,2013-03-27
     * @return 03月27日
     */
    public static String formatToDay(String dateStr) {
        if (CalendarHelper.isStrEmpty(dateStr)) {
            return "";
        }
        //DateFormat localFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);
        DateFormat localFormat = DateFormat.getDateInstance(DateFormat.LONG, Locale.CHINESE);
        Date date;
        String formatDate = null;
        try {
            date = getDateFromString(dateStr, null);
            formatDate = localFormat.format(date);
            formatDate = formatDate.substring(5);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return formatDate;
    }

    /**
     * 显示格式化的月,中文的月份
     *
     * @param dateStr eg,2013-03-27
     * @return 三月
     */
    public static String formatToMonth(String dateStr) {
        if (CalendarHelper.isStrEmpty(dateStr)) {
            return "";
        }
        if(dateStr.length() < 7){
            return "";
        }
        String month = dateStr.substring(5, 7);
        int index = Integer.parseInt(month);
        String formatDate = "";
        if (index > 0 && index < 13) {
            formatDate = mMonthCN[index - 1];
        }
        return formatDate;
    }

    /**
     * 检查字符串是否是今天
     *
     * @param dateStr
     */
    public static boolean checkIsToday(String dateStr) {
        Calendar calendar = Calendar.getInstance();
        Date currentDate = calendar.getTime();
        return getStringFromDate(currentDate, null).equals(dateStr);

    }

    /**
     * Get the Date from String with custom format. Default format is yyyy-MM-dd
     *
     * @param dateString
     * @param dateFormat
     * @return
     * @throws ParseException
     */
    public static Date getDateFromString(String dateString, String dateFormat) throws ParseException {
        SimpleDateFormat formatter;
        if (dateFormat == null) {
            if (yyyyMMddFormat == null) {
                setup();
            }
            formatter = yyyyMMddFormat;
        } else {
            formatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
        }

        return formatter.parse(dateString);
    }

    /**
     * Convert the Date to String with custom format. Default format is yyyy-MM-dd
     *
     * @param date
     * @param dateFormat
     * @return
     */
    public static String getStringFromDate(Date date, String dateFormat) {
        String dateString = null;
        SimpleDateFormat formatter;
        if (date == null) {
            return null;
        }
        if (dateFormat == null) {
            if (yyyyMMddFormat == null) {
                setup();
            }
            formatter = yyyyMMddFormat;
        } else {
            formatter = new SimpleDateFormat(dateFormat, Locale.ENGLISH);
        }
        dateString = formatter.format(date);
        return dateString;
    }

    /**
     * 获取当天的日期
     *
     * @return
     */
    public static String getTodayDateString() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
        return dateFormat.format(new Date());
    }

    /**
     * 获取指定日期的偏移后的日期字符串,offset>0日期向后,<0向前
     *
     * @param dateStr
     * @param offset
     * @return
     */
    public static String getDateStringByOffset(String dateStr, int offset) {
        if (offset == 0) {
            return dateStr;
        }
        Date date;
        String newDateStr = null;
        try {
            date = getDateFromString(dateStr, null);
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            cal.add(Calendar.DATE, offset);
            newDateStr = getStringFromDate(cal.getTime(), null);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return newDateStr;
    }

    /**
     * 获取输入日期所在周的开始日期 (周一),默认格式 yyyy-MM-dd
     *
     * @param date
     * @return String
     */
    public static String getFirstDayOfWeek(Date date, String dateFormat) {
        String firstDay;
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
            calendar.add(Calendar.DATE, -7);
        }
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        Date newDate = calendar.getTime();
        firstDay = getStringFromDate(newDate, dateFormat);
        return firstDay;
    }

    /**
     * 获取输入日期所在周的结束日期 (周日),默认格式 yyyy-MM-dd
     *
     * @param date
     * @return String
     */
    public static String getLastDayOfWeek(Date date, String dateFormat) {
        String lastDay;
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        //  默认周日是本周的开始,
        if (calendar.get(Calendar.DAY_OF_WEEK) != 1) {
            // 非周末的情况要先加一周才能获得本周的周末
            calendar.add(Calendar.DATE, 7);
        }
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        Date newDate = calendar.getTime();
        lastDay = getStringFromDate(newDate, dateFormat);
        return lastDay;
    }

    /**
     * 获得指定日期与指定周数间隔的那周周一的日期
     *
     * @param date       正数是count周数之后,负数时count周数之前,0 返回本周周一日期
     * @param dateFormat
     * @return
     */
    public static String getFirstDayOfPreviousWeek(Date date, int count, String dateFormat) {
        String firstDay;
        if (date == null) {
            return null;
        }
        if (count == 0) {
            return getFirstDayOfWeek(date, dateFormat);
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 默认周日是本周的开始,如果是周末,不加
        if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
            calendar.add(Calendar.DATE, (count - 1) * 7);
        } else {
            calendar.add(Calendar.DATE, count * 7);
        }

        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        Date newDate = calendar.getTime();
        firstDay = getStringFromDate(newDate, dateFormat);
        return firstDay;
    }

    /**
     * 获得指定日期与指定周数间隔的那周周日的日期
     *
     * @param date       正数是count周数之后,负数时count周数之前,0 返回本周周日日期
     * @param dateFormat
     * @return
     */
    public static String getLastDayOfPreviousWeek(Date date, int count, String dateFormat) {
        String lastDay;
        if (date == null) {
            return null;
        }
        if (count == 0) {
            return getLastDayOfWeek(date, dateFormat);
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 默认周日是本周的开始,要先加一周才能获得本周的周末。如果是周末,不加
        if (calendar.get(Calendar.DAY_OF_WEEK) == 1) {
            calendar.add(Calendar.DATE, (count) * 7);
        } else {
            // 非周末的情况要先加一周才能获得本周的周末
            calendar.add(Calendar.DATE, (count + 1) * 7);
        }
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        Date newDate = calendar.getTime();
        lastDay = getStringFromDate(newDate, dateFormat);
        return lastDay;
    }

    /**
     * 获取输入日期所在月的开始日期,默认格式 yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static String getFirstDayOfMonth(Date date, String dateFormat) {
        String firstDay;
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, 1);
        Date newDate = calendar.getTime();
        firstDay = getStringFromDate(newDate, dateFormat);
        return firstDay;
    }

    /**
     * 获取输入日期所在月的结束日期,默认格式 yyyy-MM-dd
     *
     * @param date
     * @return String
     */
    public static String getLastDayOfMonth(Date date, String dateFormat) {
        String lastDay;
        if (date == null) {
            return null;
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        Date newDate = calendar.getTime();
        lastDay = getStringFromDate(newDate, dateFormat);
        return lastDay;
    }

    /**
     * 获取输入日期和间隔月份所在月的开始日期,默认格式 yyyy-MM-dd
     *
     * @param date
     * @param count
     * @return
     */
    public static String getFirstDayOfPreviousMonth(Date date, int count, String dateFormat) {
        String firstDay;
        if (date == null) {
            return null;
        }
        if (count == 0) {
            return getFirstDayOfMonth(date, dateFormat);
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, count);
        calendar.set(Calendar.DATE, 1);
        Date newDate = calendar.getTime();
        firstDay = getStringFromDate(newDate, dateFormat);
        return firstDay;
    }

    /**
     * 获取输入日期和间隔月份所在月的最后日期,默认格式 yyyy-MM-dd
     *
     * @param date
     * @param count
     * @return
     */
    public static String getLastDayOfPreviousMonth(Date date, int count, String dateFormat) {
        String firstDay;
        if (date == null) {
            return null;
        }
        if (count == 0) {
            return getLastDayOfMonth(date, dateFormat);
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, count);
        calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        Date newDate = calendar.getTime();
        firstDay = getStringFromDate(newDate, dateFormat);
        return firstDay;
    }

    /**
     * 计算两个日期字符串之间的天数,格式2011-12-26
     *
     * @param dateStart 起始日期
     * @param dateEnd   结束日期
     * @return
     */
    public static int getIntervalDay(String dateStart, String dateEnd) {
        Date dateFrom;
        Date dateTo;
        long gap = 0;
        try {
            dateFrom = getDateFromString(dateStart, null);
            dateTo = getDateFromString(dateEnd, null);
            Calendar  cal = Calendar.getInstance();
            cal.setTime(dateFrom);
            long timeFrom = cal.getTimeInMillis();
            cal.setTime(dateTo);
            long timeTo = cal.getTimeInMillis();
            gap = (timeTo - timeFrom) / (1000 * 3600 * 24);
            gap = gap + 1;
            //从间隔毫秒变成间隔天数</strong>
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return (int)gap;
    }

    /**
     * 判断字符串是否为空
     *
     * @param str
     * @return
     */
    public static boolean isStrEmpty(String str) {
        if (null == str || "".equals(str.trim()) || "null".equals(str)) {
            return true;
        }
        return false;
    }
}

最后附上几个简单的测试用例:

package com.ran.interview;

import java.util.Date;

/**
* @ClassName: CalendarHelperTest
* @Description: TODO
* @author BMR
* @date 2016年3月15日 上午11:00:49
*/
public class CalendarHelperTest {

    public static void main(String[] args){
        String todayStr = CalendarHelper.getTodayDateString();

        System.out.println("today is: "+ todayStr);
        System.out.println("check is today: "+ CalendarHelper.checkIsToday(todayStr));
        System.out.println("today is (Chinese format): "+ CalendarHelper.formatToDay(todayStr));
        System.out.println("今天所在周的周一: "+ CalendarHelper.getFirstDayOfWeek(new Date(), null));
        System.out.println("今天所在周的周末: "+ CalendarHelper.getLastDayOfWeek(new Date(), null));
        System.out.println("指定日期的格式化的月,中文的月份: "+ CalendarHelper.formatToMonth(todayStr));
        System.out.println("获取输入日期所在月的开始日期: "+ CalendarHelper.getFirstDayOfMonth(new Date(), null));
        System.out.println("获取输入日期所在月的结束日期: "+ CalendarHelper.getLastDayOfMonth(new Date(), null));
        System.out.println("获得指定日期与指定周数间隔的那周周一的日期: "+ CalendarHelper.getFirstDayOfPreviousWeek(new Date(), 2, null));
        System.out.println("获得指定日期与指定周数间隔的那周周末的日期: "+ CalendarHelper.getLastDayOfPreviousWeek(new Date(), -2, null));
        System.out.println("获取输入日期和间隔月份所在月的开始日期: "+ CalendarHelper.getFirstDayOfPreviousMonth(new Date(), 2, null));
        System.out.println("获取输入日期和间隔月份所在月的最后日期: "+ CalendarHelper.getLastDayOfPreviousMonth(new Date(), -2, null));
        System.out.println("计算两个日期字符串之间的天数: "+ CalendarHelper.getIntervalDay("2016-03-01", todayStr));

    }
}

测试结果打印为:

today is: 2016-03-15
check is today: true
today is (Chinese format): 3月15日
今天所在周的周一: 2016-03-14
今天所在周的周末: 2016-03-20
指定日期的格式化的月,中文的月份: 三月
获取输入日期所在月的开始日期: 2016-03-01
获取输入日期所在月的结束日期: 2016-03-31
获得指定日期与指定周数间隔的那周周一的日期: 2016-03-28
获得指定日期与指定周数间隔的那周周末的日期: 2016-03-06
获取输入日期和间隔月份所在月的开始日期: 2016-05-01
获取输入日期和间隔月份所在月的最后日期: 2016-01-31
计算两个日期字符串之间的天数: 15
时间: 2024-10-24 23:28:43

CalendarHelper日期计算工具,各种日期的获取和计算的相关文章

精确计算工具类,提供加减乘除的计算

package com.ljq.util; import java.math.BigDecimal; /** * 精确计算工具类,提供加减乘除的计算 * * @author jqlin */ public class CompuUtils { /**小数点后保留的位数*/ public final static int SCALE = 5; /** 0 */ public final static int ZERO = 0; /** * BigDecimal大小比较 * * @param a *

计算工具的发展简史

现在我们所说的计算机,其全称是通用电子数字计算机,"通用"是指计算机可服务于多种用途,"电子"是指计算机是一种电子设备,"数字"是指在计算机内部一切信息均用0和1的编码来表示.计算机的出现是20世纪最卓越的成就之一,计算机的广泛应用极大地促进了生产力的发展. 自古以来,人类就在不断地发明和改进计算工具,从古老的"结绳记事",到算盘.计算尺.差分机,直到1946年第一台电子计算机诞生,计算工具经历了从简单到复杂.从低级到高级.从

C# 获取当前月第一天和最后一天 计算两个日期差多少天

获取当前月的第一天和最后一天 DateTime now = DateTime.Now; DateTime firstDay = new DateTime(now.Year, now.Month, 1); DateTime lastDay = firstDay.AddMonths(1).AddDays(-1); 计算两个日期差多少天 DateTime start=firstDay; DateTime end=lastDay; TimeSpan ts=end.Subtract(start); ts.

计算两个日期相隔天数 思路:假设1998-10-10 2010-5-5 首先获取1889-10-10这个日期在这一年中还剩多少天 再次获取2010-5-5这个日子在这一年内已经过了

class FunDemo6 { public static void main(String[] args) { //测试函数getDays //System.out.println(getDays(1992,4,20)); System.out.println(subDays(1999,1,5,2001,3,10)); } //判断是否为闰年 public static boolean isLeap (int y) { if(y%4==0&&y%100!=0||y%400==0) re

获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)

获取周的第一天,最后一天 System.out.println(getStartEndDate("2016-05-01", 1)); 获取星期的第一天和最后一天 System.out.println(getStartEndDate("2016-05-01", 0)); public static String getStartEndDate(String aDay, int type) { SimpleDateFormat df = new SimpleDateFo

计算两个日期之间相差几天(Date类型与String类型互相转换)

一:计算两个日期之间相差几天 1 /** 2 * 3 */ 4 package com.hlcui.date; 5 6 import java.text.ParseException; 7 import java.text.SimpleDateFormat; 8 import java.util.Calendar; 9 import java.util.Date; 10 11 import org.junit.Test; 12 13 /** 14 * @author Administrator

Js获取当前日期时间+日期印证+判断闰年+日期的天数差+日期格式化+JS判断某年某月有多少天

Js获取当前日期时间+日期验证+判断闰年+日期的天数差+日期格式化+JS判断某年某月有多少天 字符串转日期型+Js当前日期时间+日期验证+判断闰年+日期的天数差+日期格式化+日期所在年的第几周 日期时间脚本库方法列表Date.prototype.isLeapYear 判断闰年Date.prototype.Format 日期格式化Date.prototype.DateAdd 日期计算Date.prototype.DateDiff 比较日期差Date.prototype.toString 日期转字符

java实现两个日期内具有几个星期几的计算

虽然java自带的Calendar类似乎很好用,但是作为小白的我还不会用.朋友说有时需要计算任意两个日期内具有几个星期一或者星期三.问我能不能实现,我想想,能实现,可能代码不够优雅.具体代码放在下面.欢迎朋友与我分享更好的思路或工具吧~ package cn.example.mapper; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import ja

Java 根据给定的日期,计算两个日期之间的时间差

计算两个Date之间的时间差,基本思路为把Date转换为ms(微秒),然后计算两个微秒时间差. 时间的兑换规则如下: 1s秒 = 1000ms毫秒 1min分种 = 60s秒 1hours小时 = 60min分钟 1day天 = 24hours小时 package com.qiyadeng.date; import java.text.SimpleDateFormat; import java.util.Date; public class DateDifferentExample { publ