fourcal/src/main/java/cn/palmte/work/utils/DateKit.java

465 lines
14 KiB
Java

package cn.palmte.work.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Stream;
/**
* Created by wang.lin@esstx.cn on 2018/4/20.
*/
public class DateKit {
public static final String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DATE_FORMAT = "yyyy-MM-dd";
public static final String DATE_FORMAT_YEAR_MONTH = "yyyyMM";
public static final String DATE_FORMAT_YEAR_MONTH2 = "yyyy-MM";
private DateKit() {
}
/**
* 通过String类型获得指定时间
*/
public static Date getDate(String date) {
return getDate(date, TIME_FORMAT);
}
public static Date getDate(String date, String pattern) {
if (StrKit.isBlank(date)) {
return null;
}
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(StrKit.isBlank(pattern) ? TIME_FORMAT : pattern);
return dateFormat.parse(date);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
public static String toStr(Date date, String format) {
SimpleDateFormat sdf;
if (null != format && !"".equals(format)) {
sdf = new SimpleDateFormat(format);
return sdf.format(date);
} else {
sdf = new SimpleDateFormat(DateKit.TIME_FORMAT);
return sdf.format(date);
}
}
/**
* 将当前时间格式化为默认格式的字符串
*
* @return
*/
public static String formatCurrentTime() {
return new SimpleDateFormat(DATE_FORMAT).format(new Date());
}
/**
* 获取默认格式的当前时间
*
* @return
*/
public static String getCurrnetTimeString() {
return new SimpleDateFormat(TIME_FORMAT).format(new Date());
}
/**
* 获取当天(今日)零点零分零秒
*
* @return
*/
public static Date todayZeroHour() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
/**
* 获取当天(今日)23点59分59秒
*/
public static Date todayLastHour() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
return calendar.getTime();
}
public static Date dayZeroHour(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
return calendar.getTime();
}
public static Date dayLastHour(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
return calendar.getTime();
}
/**
* 获取过去N天之前的日期
*/
public static String getLastNDay(int n,String pattern){
Calendar calendar = Calendar.getInstance();
Date date = new Date();
calendar.setTime(date);
calendar.add(Calendar.DATE, -n);
date = calendar.getTime();
SimpleDateFormat dateFormater = new SimpleDateFormat(pattern);
String lastDay = dateFormater.format(date);
return lastDay;
}
/**
* 获取未来第day天的日期
* @param day
* @return
*/
public static String getFutureDate(int day) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + day);
Date today = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String result = format.format(today);
return result;
}
/**
* 获取日期的星期数
*
* @param datetime
* @return
*/
public static String dateToWeek(String datetime) {
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
Calendar cal = Calendar.getInstance(); // 获得一个日历
Date datet = null;
try {
datet = f.parse(datetime);
cal.setTime(datet);
} catch (ParseException e) {
e.printStackTrace();
}
int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
if (w < 0)
w = 0;
return weekDays[w];
}
public static Date getLastNDay(int n){
Calendar calendar = Calendar.getInstance();
Date date = new Date();
calendar.setTime(date);
calendar.add(Calendar.DATE, -n);
return calendar.getTime();
}
public static Date getLastNDay(Date date, int n){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DATE, -n);
return calendar.getTime();
}
/**
* 获取两个日期相差的月数
* @param d1 较大的日期
* @param d2 较小的日期
* @return 如果d1>d2返回 月数差 否则返回0
*/
public static int getMonthDiff(Date d1, Date d2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
if(c1.getTimeInMillis() < c2.getTimeInMillis()) return 0;
int year1 = c1.get(Calendar.YEAR);
int year2 = c2.get(Calendar.YEAR);
int month1 = c1.get(Calendar.MONTH);
int month2 = c2.get(Calendar.MONTH);
int day1 = c1.get(Calendar.DAY_OF_MONTH);
int day2 = c2.get(Calendar.DAY_OF_MONTH);
// 获取年的差值 假设 d1 = 2015-8-16 d2 = 2011-9-30
int yearInterval = year1 - year2;
// 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数
if(month1 < month2 || month1 == month2 && day1 < day2) {yearInterval --;}
// 获取月数差值
int monthInterval = (month1 + 12) - month2 ;
if(day1 < day2) {monthInterval --;}
monthInterval %= 12;
return yearInterval * 12 + monthInterval;
}
/**
* 返回 d2与d1之间相差的天数
* @param d1
* @param d2
* @return
*/
public static int getDayDiff(String d1, String d2) {
Date date1 = getDate(d1);
Date date2 = getDate(d2);
if (date1 != null && date2 != null) {
return (int) ((date2.getTime() - date1.getTime()) / (1000*3600*24));
}
return 0;
}
/**
* 计算两个日期之间相差的天数
* @param smdate 较小的时间
* @param bdate 较大的时间
* @return 相差天数
* @throws ParseException
*/
public static int daysBetween(Date smdate,Date bdate) throws ParseException
{
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);
return Integer.parseInt(String.valueOf(between_days));
}
/**
* 获取某一天所在的月,返回yyyymm
* @param day yyyy-mm-dd
*/
public static String dayYearMonth(String day){
Date date = DateKit.getDate(day, DateKit.DATE_FORMAT);
return DateKit.toStr(date, DateKit.DATE_FORMAT_YEAR_MONTH);
}
/**
* 获取当前时间是星期几
* @return 星期一返回1 星期二返回2...
*/
public static int dayForWeek(){
Calendar c = Calendar.getInstance();
c.setTime(new Date());
int dayForWeek;
if(c.get(Calendar.DAY_OF_WEEK) == 1){
dayForWeek = 7;
}else{
dayForWeek = c.get(Calendar.DAY_OF_WEEK) - 1;
}
return dayForWeek;
}
public static Date getDateByParDate(Date date,int count){
Calendar c = Calendar.getInstance();
c.setTime(date);
int day1 = c.get(Calendar.DATE);
c.set(Calendar.DATE, day1 + count);
return c.getTime();
}
public static void main(String[] args) {
String dateStr = "2018-09-01";
Date date = DateKit.getDate(dateStr,DATE_FORMAT);
Date date2 = DateKit.getDateByParDate(date,-3);
System.out.println(DateKit.toStr(date2,DATE_FORMAT));
getBetweenDate("2018-08-01",dateStr);
}
/**
* 获取两个时间中最新的一个
* @param date1
* @param date2
* @return
*/
public static Date getLastDate(Date date1, Date date2) {
if (date1 == null && date2 == null) {
return new Date();
}
if (date1 == null) {
return date2;
}
if (date2 == null) {
return date1;
}
if (date1.getTime() > date2.getTime()) {
return date1;
}else {
return date2;
}
}
/**
* 传入一个日期,获取该日期所在月份的第一天
* @param date
* @return
*/
public static Date getMonthStartByDate(Date date){
return getMonthStart(date);
}
/**
* 传入一个日期,获取该日期所在月份的最后一天
* @param date
* @return
*/
public static Date getMonthEndByDate(Date date){
return getMonthEnd(date);
}
private static Date getMonthStart(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int index = calendar.get(Calendar.DAY_OF_MONTH);
calendar.add(Calendar.DATE, (1 - index));
return calendar.getTime();
}
private static Date getMonthEnd(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, 1);
int index = calendar.get(Calendar.DAY_OF_MONTH);
calendar.add(Calendar.DATE, (-index));
return calendar.getTime();
}
/**
* 获取指定日期的月的第一天和最后一天日期字符串
*/
public static SyncParams getFirstAndLastDateOfMonthBParams(Date date) {
// 获取当前年份、月份、日期
Calendar cale = Calendar.getInstance();
cale.setTime(date);
// 获取当月第一天和最后一天
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 获取前月的第一天
cale = Calendar.getInstance();
cale.setTime(date);
cale.add(Calendar.MONTH, 0);
cale.set(Calendar.DAY_OF_MONTH, 1);
String firstday = format.format(cale.getTime());
// 获取前月的最后一天
cale = Calendar.getInstance();
cale.setTime(date);
cale.add(Calendar.MONTH, 1);
cale.set(Calendar.DAY_OF_MONTH, 0);
String lastday = format.format(cale.getTime());
SyncParams s = new SyncParams();
s.start = firstday;
s.end = lastday;
return s;
}
public static class SyncParams {
public String start;
public String end;
/**
* @return
* @see Object#toString()
*/
@Override
public String toString() {
return start + " - " + end;
}
}
/**
* 当前时间是否在某个时间段内
* @param startDate
* @param endDate
* @return
*/
public static boolean dateBetween(String startDate, String endDate) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date now = null;
Date start = null;
Date end = null;
try {
start = format.parse(startDate);
end = format.parse(endDate);
now = format.parse(format.format(new Date()));
} catch (ParseException e) {
e.printStackTrace();
return false;
}
long nowTime = now.getTime();
long startTime = start.getTime();
long endTime = end.getTime();
return nowTime >= startTime && nowTime <= endTime;
}
public static Long getSecondsNextEarlyMorning() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
// 改成这样就好了
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
return (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
}
/**
* 获取两个日期间隔的所有日期
* @param start 格式必须为'2018-01-25'
* @param end 格式必须为'2018-01-25'
* @return
*/
public static List<String> getBetweenDate(String start, String end){
List<String> list = new ArrayList<>();
LocalDate startDate = LocalDate.parse(start);
LocalDate endDate = LocalDate.parse(end);
long distance = ChronoUnit.DAYS.between(startDate, endDate);
if (distance < 1) {
return list;
}
Stream.iterate(startDate, d -> {
return d.plusDays(1);
}).limit(distance + 1).forEach(f -> {
list.add(f.toString());
});
return list;
}
}