package com.exmind.utils.date;/**
* Created by DELL on 2017/6/2.
*/
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* jdk8 时间工具类
*
* @author pengXiaoLin
* @create 2017-06-02 8:49
**/
public class Date8Util {
/**
* 获取默认时间格式: yyyy-MM-dd HH:mm:ss
*/
private static final DateTimeFormatter DEFAULT_DATETIME_FORMATTER = TimeFormat.LONG_DATE_PATTERN_LINE.formatter;
private Date8Util() {
// no construct function
}
/**
* String 转时间
*
* @param timeStr
* @return
*/
public static LocalDateTime parseTime(String timeStr) {
return LocalDateTime.parse(timeStr, DEFAULT_DATETIME_FORMATTER);
}
/**
* String 转时间
*
* @param timeStr
* @param format 时间格式
* @return
*/
public static LocalDateTime parseTime(String timeStr, TimeFormat format) {
return LocalDateTime.parse(timeStr, format.formatter);
}
/**
* 时间转 String
*
* @param time
* @return
*/
public static String parseTime(LocalDateTime time) {
return DEFAULT_DATETIME_FORMATTER.format(time);
}
/**
* 时间转 String
*
* @param time
* @param format 时间格式
* @return
*/
public static String parseTime(LocalDateTime time, TimeFormat format) {
return format.formatter.format(time);
}
/**
* 获取当前时间
* 返回默认格式 2017-06-02 18:41:15
*
* @return
*/
public static String getCurrentDatetime() {
return DEFAULT_DATETIME_FORMATTER.format(LocalDateTime.now());
}
/**
* 获取当前时间
* 返回特定的格式
*
* @param format 时间格式
* @return
*/
public static String getCurrentDatetime(TimeFormat format) {
return format.formatter.format(LocalDateTime.now());
}
/**
* date 转 LocalDateTime
*
* @param date
* @return
*/
public static LocalDateTime dateToLocalDateTime(java.util.Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
return LocalDateTime.ofInstant(instant, zone);
}
/**
* date 转 LocalDate
*
* @param date
* @return
*/
public static LocalDate dateToLocalDate(java.util.Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalDate();
}
/**
* date 转 LocalTime
*
* @param date
* @return
*/
public static LocalTime dateToLocalTime(java.util.Date date) {
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, zone);
return localDateTime.toLocalTime();
}
/**
* LocalDateTime 转 java.util.Date
*
* @return
*/
public static Date LocalDateTimeToUdate(LocalDateTime localDateTime) {
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
return Date.from(instant);
}
/**
* 计算两个时间的相差天数
*
* @param start 开始时间
* @param end 结束时间
* @return
*/
public static long between(Date start, Date end) {
LocalDate beginDate = dateToLocalDate(start);
LocalDate endDate = dateToLocalDate(end);
return endDate.toEpochDay() - beginDate.toEpochDay();
}
/**
* 计算与当天的相差天数
*
* @param date
* @return
*/
public static long betweenToDay(Date date) {
LocalDate beginDate = dateToLocalDate(date);
LocalDate endDate = dateToLocalDate(new Date());
return endDate.toEpochDay() - beginDate.toEpochDay();
}
/**
* 判断两个时间段 是否有交集
* 注意每隔时间段的结束时间一定更要大于开始时间 我这里就不做这个判断了
*
* @param leftStartDate
* @param leftEndDate
* @param rightStartDate
* @param rightEndDate
* @return
*/
public static boolean isOverlap(Date leftStartDate, Date leftEndDate, Date rightStartDate, Date rightEndDate) {
boolean bool = false;
if (between(rightStartDate, leftEndDate) >= 0 && between(leftStartDate, rightEndDate) >= 0) {
bool = true;
}
return bool;
}
/**
* 判断两个时间段 是否有交集
* 注意每隔时间段的结束时间一定更要大于开始时间 我这里就不做这个判断了
*
* @param startdate1
* @param enddate1
* @param startdate2
* @param enddate2
* @return
* @throws ParseException
*/
public static boolean isOverlap(String startdate1, String enddate1, String startdate2, String enddate2) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date leftStartDate = null;
Date leftEndDate = null;
Date rightStartDate = null;
Date rightEndDate = null;
try {
leftStartDate = format.parse(startdate1);
leftEndDate = format.parse(enddate1);
rightStartDate = format.parse(startdate2);
rightEndDate = format.parse(enddate2);
} catch (ParseException e) {
return false;
}
boolean bool = false;
if (between(rightStartDate, leftEndDate) >= 0 && between(leftStartDate, rightEndDate) >= 0) {
bool = true;
}
return bool;
}
/**
* 时间字符串格式化,如果format为null,返回默认的格式
* @param dateTime
* @param format
* @return
*/
/*public static String format(String dateTime,TimeFormat format){
if (StringUtils.isEmpty(dateTime)) {
return null;
}
if (null == format) {
TemporalAccessor a = DEFAULT_DATETIME_FORMATTER.parse(dateTime);
return "";
}
return format.formatter.parse(dateTime).toString();
}*/
/**
* 时间格式
*/
public enum TimeFormat {
/**
* 短时间格式
*/
SHORT_DATE_PATTERN_LINE("yyyy-MM-dd"),
SHORT_DATE_PATTERN_SLASH("yyyy/MM/dd"),
SHORT_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd"),
SHORT_DATE_PATTERN_NONE("yyyyMMdd"),
/**
* 长时间格式
*/
LONG_DATE_PATTERN_LINE("yyyy-MM-dd HH:mm:ss"),
LONG_DATE_PATTERN_SLASH("yyyy/MM/dd HH:mm:ss"),
LONG_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd HH:mm:ss"),
LONG_DATE_PATTERN_NONE("yyyyMMdd HH:mm:ss"),
/**
* 长时间格式 带毫秒
*/
LONG_DATE_PATTERN_WITH_MILSEC_LINE("yyyy-MM-dd HH:mm:ss.SSS"),
LONG_DATE_PATTERN_WITH_MILSEC_SLASH("yyyy/MM/dd HH:mm:ss.SSS"),
LONG_DATE_PATTERN_WITH_MILSEC_DOUBLE_SLASH("yyyy\\MM\\dd HH:mm:ss.SSS"),
LONG_DATE_PATTERN_WITH_MILSEC_NONE("yyyyMMdd HH:mm:ss.SSS");
private transient DateTimeFormatter formatter;
TimeFormat(String pattern) {
formatter = DateTimeFormatter.ofPattern(pattern);
}
}
public static void main(String[] args) {
try {
boolean b = isOverlap("2017-05-01", "2017-06-01", "2017-06-01", "2017-08-30");
System.out.println(b);
} catch (ParseException e) {
e.printStackTrace();
}
}
}