package com.kidgrow.common.utils;
import org.apache.commons.lang3.StringUtils;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
*
* @Description:
* @Project:
* @CreateDate: Created in 2020/2/28 11:07
* @Author: liuke
*/
public class DateCalUtil {
/**
* 将字符串转换成具体的时间(Calendar)
* @return Calendar 时间
* @param str 为要格式化字符串
*/
public static Calendar getCalendarByStr(String str) {
if (str == null) return null;
Date date = getDateByStr(str);
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setTime(date);
return cal;
}
/**
* 将Calendar类型转化为字符串类型
* @param calendar 要转化的Calendar类型变量
* @param hasTime true :yyyy-MM-dd HH:mm:ss;false:yyyy-MM-dd
* @return
*/
public static String getCalendarStr(Calendar calendar ,boolean hasTime ) {
if (calendar == null) return "";
return getDateStr(calendar.getTime() ,hasTime );
}
/**
* 将具体的时间转换成字符串
* @return 转换后的字符串格式为yyyy-MM-dd HH:mm:ss 或 yyyy-MM-dd
* @param aDate 为要格式化的时间
* @param hasTime :返回的字符串是否包括时间 true:包括时间 false:只有日期
*/
public static String getDateStr(Date aDate,boolean hasTime ) {
if (aDate == null) return "";
String dateStr = "";
if(hasTime)
dateStr = getDateStrByDefineStyle(aDate,"yyyy-MM-dd HH:mm:ss");
else
dateStr = getDateStrByDefineStyle(aDate,"yyyy-MM-dd");
return dateStr;
}
/**
* 返回由指定字符串转换成的时间,字符串格式类似"2006-2-12 14:22:30" 或"2006-2-12"
* @return 转换后的时间
* @param aStr 为要转换成时间的字符串
*/
public static Date getDateByStr(String aStr) {
SimpleDateFormat df =null;
if (aStr == null) return null;
if(aStr.indexOf(":")>0 )//如果有时间
df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
else //如果没有时间
df = new SimpleDateFormat("yyyy-MM-dd");
try
{
Date result = df.parse(aStr);
return result;
}
catch (Exception e)
{
return null;
}
}
/**
* 将具体的时间根据要求的格式,转换成字符串
* @param aDate 为要格式化的时间
* @param style 要转化的格式
* @return
*/
public static String getDateStrByDefineStyle(Date aDate,String style){
if (aDate == null) return "";
SimpleDateFormat df= new SimpleDateFormat(style);
String s = df.format(aDate);
return s;
}
/**
* 将具体的时间转换成字符串
* @return 转换后的字符串,格式为yyyy-MM-dd HH:mm:ss
* @param aDate 为要格式化的时间
*/
public static String getDateStr(Date aDate) {
if (aDate == null) return "";
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = df.format(aDate);
return s;
// return getDateStr(aDate,true);
}
/**
* 获取昨日日期字符串
* @return 昨日日期字符串,格式为yyyy-MM-dd
*/
public static String getYesterdayStr() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
return getCalendarStr(cal, false);
}
/**
* 获取一周前日期字符串
* @return 一周前日期字符串,格式为yyyy-MM-dd
*/
public static String getWeekAgoStr() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -7);
return getCalendarStr(cal, false);
}
/**
* 获取某日期半年后日期字符串
* @return 半年后日期字符串,格式为yyyy-MM-dd HH:mm:ss
*/
public static String getHalfYearStr(Date aDate) {
Calendar cal = Calendar.getInstance();
cal.setTime(aDate);
cal.add(Calendar.MONTH, 6);
return getCalendarStr(cal, true);
}
/**
* 获取本周第一天日期字符串
* @return 本周第一天日期字符串,格式为yyyy-MM-dd
*/
public static String getWeekFirstStr() {
Calendar cal = Calendar.getInstance();
int day_of_week = cal.get(Calendar.DAY_OF_WEEK) - 2;
cal.add(Calendar.DATE, -day_of_week);
return getCalendarStr(cal, false);
}
/**
* 获取本周最后一天日期字符串
* @return 本周最后一天日期字符串,格式为yyyy-MM-dd
*/
public static String getWeekLastStr() {
Calendar cal = Calendar.getInstance();
int day_of_week = cal.get(Calendar.DAY_OF_WEEK) - 2;
cal.add(Calendar.DATE, -day_of_week);
cal.add(Calendar.DATE, 6);
return getCalendarStr(cal, false);
}
/**
* 获取本月第一天日期字符串
* @return 本月第一天日期字符串,格式为yyyy-MM-dd
*/
public static String getMonthFirstStr() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
return getCalendarStr(cal, false);
}
/**
* 获取本月最后一天日期字符串
* @return 本月最后一天日期字符串,格式为yyyy-MM-dd
*/
public static String getMonthLastStr() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
return getCalendarStr(cal, false);
}
/**
* 获取本年第一天日期字符串
* @return 本年第一天日期字符串,格式为yyyy-MM-dd
*/
public static String getYearFirstStr() {
Calendar cal = Calendar.getInstance();
int currentYear = cal.get(Calendar.YEAR);
cal.clear();
cal.set(Calendar.YEAR, currentYear);
return getCalendarStr(cal, false);
}
/**
* 获取本年最后一天日期字符串
* @return 本年最后一天日期字符串,格式为yyyy-MM-dd
*/
public static String getYearLastStr() {
Calendar cal = Calendar.getInstance();
int currentYear = cal.get(Calendar.YEAR);
cal.clear();
cal.set(Calendar.YEAR, currentYear);
cal.roll(Calendar.DAY_OF_YEAR, -1);
return getCalendarStr(cal, false);
}
/**
* 获取本月第一天日期时间字符串
* @author Han Guohong
* @return
*/
public static String getNowMonthFirstStr() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为上月第一天
return getCalendarStr(cal, false)+" 00:00:00";
}
/**
* 获取本月最后一天日期时间字符串
* @author Han Guohong
* @return
*/
public static String getNowMonthLastStr() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
return getCalendarStr(cal, false)+" 23:59:59";
}
/**
* 获取上月第一天日期字符串
* @return 上月第一天日期字符串,格式为yyyy-MM-dd
*/
public static String getPreMonthFirstStr() {
Calendar cal = Calendar.getInstance();
int currentMonth = cal.get(Calendar.MONTH);
cal.set(Calendar.MONTH, currentMonth-1);
cal.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为上月第一天
return getCalendarStr(cal, false);
}
/**
* 获取上月最后一天日期字符串
* @return 上月最后一天日期字符串,格式为yyyy-MM-dd
*/
public static String getPreMonthLastStr() {
Calendar cal = Calendar.getInstance();
int currentMonth = cal.get(Calendar.MONTH);
cal.set(Calendar.MONTH, currentMonth-1);
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
return getCalendarStr(cal, false);
}
/**
* 根据用户生日计算年龄
*/
public static int getAgeByBirthday(Date birthday) {
Calendar cal = Calendar.getInstance();
if (cal.before(birthday)) {
throw new IllegalArgumentException(
"The birthDay is before Now.It's unbelievable!");
}
int yearNow = cal.get(Calendar.YEAR);
int monthNow = cal.get(Calendar.MONTH) + 1;
int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(birthday);
int yearBirth = cal.get(Calendar.YEAR);
int monthBirth = cal.get(Calendar.MONTH) + 1;
int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
int age = yearNow - yearBirth;
if (monthNow <= monthBirth) {
if (monthNow == monthBirth) {
// monthNow==monthBirth
if (dayOfMonthNow < dayOfMonthBirth) {
age--;
}
} else {
// monthNow>monthBirth
age--;
}
}
return age;
}
//获得全球唯一性的id
public static String getId(){
String id= UUID.randomUUID().toString();
id=id.replace("-", "");//替换掉中间的那个斜杠
return id;
}
/**
* 计算两个时间差值(分钟)
*/
public static int dateDiffMin(Date date1,Date date2) {
long diff;
long nd = 1000*24*60*60;//一天的毫秒数
long nh = 1000*60*60;//一小时的毫秒数
long nm = 1000*60;//一分钟的毫秒数
//获得两个时间的毫秒时间差异
diff = date1.getTime() - date2.getTime();
long min = diff%nd%nh/nm;//计算差多少分钟
return new Long(min).intValue();
}
/**
* 获取指定日期前几天或者后几天的日期
* @author Han Guohong
* @param date
* @param days
* @return
*/
public static String getBeforeOrAfterDaysDate(Date date,int days) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, days);
return getCalendarStr(cal, false);
}
/**
* 获取指定时间前几分钟或者后几分钟的时间
* @param date
* @param minute
* @return
*/
public static String getBeforeOrAfterMinuteTime(Date date,int minute) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MINUTE, minute);
return getCalendarStr(cal, false);
}
/**
* 获取指定日期中间的所有日期
*/
public static List findDates(Date dBegin, Date dEnd){
List lDate = new ArrayList();
lDate.add(dBegin);
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(calBegin.getTime());
}
return lDate;
}
public static String removeLast(String dateStr){
if(StringUtils.isNotBlank(dateStr.trim())){
return dateStr.substring(0, 19);
}
return null;
}
/**
* 获取某天的开始时间
* @author Han Guohong
* @param date
* @return
*/
public static Date getDayBegin(Date date){
return getDateByStr(getDateStr(date, false)+" 00:00:00");
}
/**
* 获取某天的结束时间
* @author Han Guohong
* @param date
* @return
*/
public static Date getDayEnd(Date date){
String dateString = getBeforeOrAfterDaysDate(date, +1);
date = getDateByStr(dateString);
return getDateByStr(getDateStr(date, false)+" 00:00:00");
}
/*public static void main(String [] args){
Date now = new Date();
Date end = getDateByStr(getBeforeOrAfterDaysDate(now, -5));
Date begin = getDateByStr(getBeforeOrAfterDaysDate(now, -10));
List list = findDates(begin, end);
for (Date date : list) {
System.out.println(getDateStr(date, true));
}
System.out.println(getDayEnd(now));
}*/
}