import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.TemporalAdjusters;
import java.util.Calendar;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
/**
* @Author : zhq
* @since : 2018/3/28
*/
public class DateUtil {
public static void main(String[] args) throws ParseException {
System.out.println(getLastDayOfMonth("2017-02"));
System.out.println(getFirstDayOfMonth("2017-02"));
String date1 = "2017-08-11 00:00:00";
String date2 = "2017-11-21 00:00:00";
System.out.println(date1+"到"+date2+"时间相差:"+getMonthCount(date1,date2)+" 个月");
}
/**
* 根据date1和date2算出相差几个月
* @param date1
* @param date2
* @return
* @throws ParseException
*/
public static int getMonthCount(String date1,String date2) throws ParseException {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar c1=Calendar.getInstance();
Calendar c2=Calendar.getInstance();
c1.setTime(sdf.parse(date1));
c2.setTime(sdf.parse(date2));
int year =c2.get(Calendar.YEAR)-c1.get(Calendar.YEAR);
//开始日期若小月结束日期
if(year<0){
return 0;
}
return year*12+c2.get(Calendar.MONTH)-c1.get(Calendar.MONTH);
}
/**
* java8(经测试别的版本获取2月有bug) 获取某月第一天的00:00:00
* @return
*/
public static String getFirstDayOfMonth(String datestr){
if (StringUtils.isBlank(datestr)) return null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = strToDateNotDD(datestr);
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());;
LocalDateTime endOfDay = localDateTime.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
Date dates = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
return sdf.format(dates);
}
/**
* java8(别的版本获取2月有bug) 获取某月最后一天的23:59:59
* @return
*/
public static String getLastDayOfMonth(String datestr){
if (StringUtils.isBlank(datestr)) return null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = strToDateNotDD(datestr);
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());;
LocalDateTime endOfDay = localDateTime.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
Date dates = Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
return sdf.format(dates);
}
/**
* 将短时间格式字符串转换为时间 yyyy-MM( 2017-02)
* @param strDate
* @return
*/
public static Date strToDateNotDD(String strDate) {
if (StringUtils.isBlank(strDate)) return null;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM");
ParsePosition pos = new ParsePosition(0);
Date strtodate = formatter.parse(strDate, pos);
return strtodate;
}
}
一.获取传入日期所在月的第一天
public static Date getFirstDayDateOfMonth(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
final int last = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, last);
return cal.getTime();
}
二.获取传入日期所在月的最后一天
public static Date getLastDayOfMonth(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
final int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, last);
return cal.getTime();
}
三.获取传入日期所在年的第一天
public static Date getFirstDayDateOfYear(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
final int last = cal.getActualMinimum(Calendar.DAY_OF_YEAR);
cal.set(Calendar.DAY_OF_YEAR, last);
return cal.getTime();
}
四.获取传入日期所在年的最后一天
public static Date getLastDayOfYear(final Date date) {
final Calendar cal = Calendar.getInstance();
cal.setTime(date);
final int last = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
cal.set(Calendar.DAY_OF_YEAR, last);
return cal.getTime();
}
五.获取指定年月的第一天
/**
* 获取指定年月的第一天
* @param year
* @param month
* @return
*/
public static String getFirstDayOfMonth1(int year, int month) {
Calendar cal = Calendar.getInstance();
//设置年份
cal.set(Calendar.YEAR, year);
//设置月份
cal.set(Calendar.MONTH, month-1);
//获取某月最小天数
int firstDay = cal.getMinimum(Calendar.DATE);
//设置日历中月份的最小天数
cal.set(Calendar.DAY_OF_MONTH,firstDay);
//格式化日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(cal.getTime());
}
六.传入年和月,获取到本月的最后一天
/**
* 获取指定年月的最后一天
* @param year
* @param month
* @return
*/
public static String getLastDayOfMonth1(int year, int month) {
Calendar cal = Calendar.getInstance();
//设置年份
cal.set(Calendar.YEAR, year);
//设置月份
cal.set(Calendar.MONTH, month-1);
//获取某月最大天数
int lastDay = cal.getActualMaximum(Calendar.DATE);
//设置日历中月份的最大天数
cal.set(Calendar.DAY_OF_MONTH, lastDay);
//格式化日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(cal.getTime());
}