package org.gpscloud.util;
import org.joda.time.DateTime;
import org.joda.time.Seconds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
public class DateUtils {
private final static Logger logger = LoggerFactory.getLogger(DateUtils.class);
private static final String DATE_FORMAT_DEFAULT = "yyyy-MM-dd HH:mm:ss";
private static final String DATE_FORMAT_YMD = "yyyy-MM-dd";
/**
* 获得某天最大时间 2018-07-04 23:59:59
*/
public static Date getEndOfDay(Date date) {
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());;
LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* 获得某天最小时间 2018-07-04 00:00:00
*/
public static Date getStartOfDay(Date date) {
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(date.getTime()), ZoneId.systemDefault());
LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);
return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* 取得当前日期所在周的第一天
* 周一为第一天
* @param date
* @return
*/
public static Date getMonDayOfWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK,
calendar.getFirstDayOfWeek()); // MONDAY
return calendar.getTime();
}
/**
* 取得当前日期所在周的最后一天
*
* @param date
* @return
*/
public static Date getLastDayOfWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK,
calendar.getFirstDayOfWeek() + 6); // Saturday
return calendar.getTime();
}
/**
* 得到几天前的时间
* @param d
* @param day
* @return
*/
public static Date getDateBefore(Date d,int day){
Calendar now =Calendar.getInstance();
now.setTime(d);
now.set(Calendar.DATE,now.get(Calendar.DATE)-day);
return now.getTime();
}
/**
* 得到几天后的时间
* @param d
* @param day
* @return
*/
public static Date getDateAfter(Date d,int day){
Calendar now =Calendar.getInstance();
now.setTime(d);
now.set(Calendar.DATE,now.get(Calendar.DATE)+day);
return now.getTime();
}
/**
* 两个时间年月相等
* @param date1
* @param date2
* @return
*/
public static boolean isSameMonth(Date date1, Date date2) {
try {
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
boolean isSameYear = cal1.get(Calendar.YEAR) == cal2
.get(Calendar.YEAR);
boolean isSameMonth = isSameYear
&& cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH);
// boolean isSameDate = isSameMonth
// && cal1.get(Calendar.DAY_OF_MONTH) == cal2
// .get(Calendar.DAY_OF_MONTH); 两个时间年月日都相等
return isSameMonth;
} catch (Exception e) {
// logger.error("[RatingEngine] error occurred: ERROR ", e);
}
return false;
}
public static String getCurrentTime()
{
return new DateTime().toString(DATE_FORMAT_DEFAULT);
}
public static String getCurrentDay()
{
return new DateTime().toString(DATE_FORMAT_YMD);
}
public static String getCurrentTime(Date date)
{
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_DEFAULT);
return sdf.format(date);
}
public static String getCurrentDay(Date date)
{
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_YMD);
return sdf.format(date);
}
/**
* 获取SimpleDateFormat
*
* @param parttern 日期格式
* @return SimpleDateFormat对象
* @throws RuntimeException 异常:非法日期格式
*/
private static SimpleDateFormat getDateFormat(String parttern) throws RuntimeException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(parttern);
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
return simpleDateFormat;
}
public static Date getNextDate(Date date) {
Calendar cd = Calendar.getInstance();
cd.setTime(date);
cd.add(Calendar.DATE, 1);//增加一天
//cd.add(Calendar.MONTH, n);//增加一个月
return cd.getTime();
}
/**
* 将日期字符串转化为日期。失败返回null。
*
* @param dataStr 日期字符串
* @param dataStyle 日期格式
* @return 日期
*/
public static Date stringToDate(String dataStr, String dataStyle) {
Date myDate = null;
if (dataStr != null) {
try {
myDate = getDateFormat(dataStyle).parse(dataStr);
} catch (Exception e) {
}
}
return myDate;
}
/**
* 计算两个日期之间相差的天数
*
* @param smdate 较小的时间
* @param bdate 较大的时间
* @return 相差天数
*/
public static Integer daysBetween(Date smdate, Date bdate) {
Integer days = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
smdate = sdf.parse(sdf.format(smdate));
bdate = sdf.parse(sdf.format(bdate));
Calendar cal = Calendar.getInstance();
cal.setTime(smdate);
long time1 = cal.getTimeInMillis();
cal.setTime(bdate);
long time2 = cal.getTimeInMillis();
long between_days = (time2 - time1) / (1000 * 3600 * 24);
days = Integer.parseInt(String.valueOf(between_days));
} catch (ParseException e) {
logger.error("daysBetween error {}", e);
}
return days;
}
/**
* 比较年份是否相同
*
* @param sDate 开始时间
* @param eDate 结束时间
* @return boolean
*/
public static boolean isSameYear(Date sDate, Date eDate) {
return new DateTime(sDate).getYear() == new DateTime(eDate).getYear();
}
/**
* 时间范围在一小时之内
*
* @param locateDate locateDate
* @param recordTime recordTime
* @return
*/
public static boolean isSameYearAnDayAndHours(Date locateDate, Date recordTime) {
return Seconds.secondsBetween(new DateTime(locateDate), new DateTime(recordTime)).getSeconds() <= 3600;
}
}